title: slf4j使用说明
使用介绍
slf4j简介
SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
为什么要使用slf4j
- 使得你的程序独立于任意特定的日志类库,这意味着不需要管理多个日志配置或者多个日志类库。
- SLF4J提供了基于占位符的日志方法,这通过去除检查isDebugEnabled(), isInfoEnabled()等等,提高了代码可读性。
- 通过使用SLF4J的日志方法,你可以延迟构建日志信息(String)的开销,直到你真正需要,这对于内存和CPU都是高效的。
- 替代Commons Logging,解决其存在的ClassLoader问题。
- 这些好处只是冰山一角,你将在开始使用SL4J和阅读其中代码的时候知道更多的好处。任何一个新的Java程序员,都应该使用SLF4J做日志而不是使用包括Log4J在内的其他日志API。
配置
项目pom.xml中添加dependency
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.6</version> </dependency>
之后会添加三个包:slf4j-api-1.7.6.jar, slf4j-log4j12-1.7.6.jar, log4j-1.2.17.jar
项目下添加 log4j.properties
Example: log4j.properties
#config root logger log4j.rootLogger = INFO,system.out log4j.appender.system.out=org.apache.log4j.ConsoleAppender log4j.appender.system.out.layout=org.apache.log4j.PatternLayout log4j.appender.system.out.layout.ConversionPattern=MINAServer Logger-->%5p{%F:%L}-%m%n #config this Project.file logger log4j.logger.thisProject.file=INFO,thisProject.file.out log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender log4j.appender.thisProject.file.out.File=logContentFile.log log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout
在代码中添加
private static final Logger logger = LoggerFactory.getLogger(MINAServer.class); . . logger.info("now {}" , "starting server");
代码中与log4j写法不一样的地方
这是你在Log4j(或者Commons Logging)中使用的方案,降低了代码可读性因为增加了不必要的繁琐代码。
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
如果你使用SLF4J的话,你可以得到在极简洁的格式的结果,就像以下展示的一样:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
在SLF4J,我们不需要字符串连接而且不会导致暂时不需要的字符串消耗。取而代之的,我们在一个以占位符和以参数传递实际值的模板格式下写日志信息。
在生产最终日志信息的字符串之前,这个方法会检查一个特定的日志级别是不是打开了,这不仅降低了内存消耗而且预先降低了CPU去处理字符串连接命令的时间。这里是使用SLF4J日志方法的代码,来自于slf4j-log4j12-1.7.6.jar中的Log4j的适配器类Log4jLoggerAdapter
public void debug(String format, Object arg) {
if (logger.isDebugEnabled()) {
FormattingTuple ft = MessageFormatter.format(format, arg);
logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
}
}
同时,我们需要知道记录日志是对应用程序的性能有着很大影响的,在生产环节上只进行必要的日志记录。
注意
- log4j.properties具体配置信息请自行搜索,也可使用log4j.xml。
- log4j.properties文件放在src目录下,默认加载。
参考资料
- 《slf4j-api、slf4j-log4j12以及log4j之间什么关系》 http://blog.csdn.net/tengdazhang770960436/article/details/18006127
- 《slf4j和log4j合用的(Maven)配置》 http://blog.csdn.net/anialy/article/details/8529188
- 《为什么要使用SLF4J而不是Log4J》 http://www.importnew.com/7450.html