The World Best ST.

初入SLF4J

字数统计: 585阅读时长: 2 min
2019/04/12 Share

初学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

CATALOG
  1. 1. 初学SLF4J
    1. 1.1. 什么是日志系统
    2. 1.2. 比较常见的两个日志框架
      1. 1.2.1. 一般的日志组合
    3. 1.3. slf4j和log4j相比有什么优缺点
    4. 1.4. slf4j使用方法