初学SLF4J
- slf4j是个日志门面,不是具体日志解决方案,只服务于各种各样的日志系统
- 可以理解为JDBC?但无需JDBC的数据库属性配置
什么是日志系统
在java里面有很多很多优秀的日志系统,但是引入很多第三方包的时候,这些包又会自带自己的日志系统,那么如果每个包都使用自己的日志系统,又怎么能保证不会冲突呢,相当有可能会冲突或者报错呀,所以这个时候就出现了日志框架!
日志框架就是来解决各个日志系统之间的兼容性问题
比较常见的两个日志框架
- commons-logging
- slf4j
一般的日志组合
- commons-logging + log4j
- slf4j + logback
slf4j和log4j相比有什么优缺点
- slf4j有一个很好的功能——占位符功能
在代码中用{}来表示,不仅缩减了代码中很多字符串的链接,而且减少了创建String对象时所需要的资源,说明只有在需要字符串的时候才创建它??
例如:1
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
在slf4j中不需要进行字符串的拼接
在slf4j的日志方法中(源码),会首先检查是否开启了该日志级别
注: 日志会对应用程序的性能产生压力,建议在生产环境才强制记录日志
slf4j使用方法
pom.xml:1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
用法:
1 | Logger logger = LoggerFactory.getLogger(Object.class); |
当同一个系统引入多个日志系统时, 会提示同时引入了多个slf4j的实现, 然后选择其中的某一个使用
根据源码分析, 所有的slf4j的实现, 一定有org/slf4j/impl/StaticLoggerBinder.class的存在, 当引入多个实现时,编译器会选择其中一个进行绑定, 并在reportActualBinding方法中输出绑定的具体是哪个框架
具体输出代码:
1 | Util.report("Actual binding is of type [" + StaticLoggerBinder.getSingleton().getLoggerFactoryClassStr() + "]"); |
本文参考资料详见: http://www.importnew.com/28494.html