在接入日志系统的时候,通常会引入slf4j-api, slf4j-log4j12以及log4j等包,但是看他们长得都差不多,彼此之间有什么联系呢?为什么要引入这些包?不能直接接入log4j就行了吗?
首先,要知道什么是日志门面?日志门面其实就是关于日志的api,常见的有common-logging和slf4j。common-logging 是 apache 的一个开源项目,提供日志功能的 API 接口,本身并不提供日志的具体实现,而是在运行时动态的绑定日志实现组件来工作。类似于 Common-Logging,slf4j 是对不同日志框架提供的一个 API 封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,slf4j 在编译时静态绑定真正的 Log 库。
其次,有了API后,需要有具体的实现,绑定日志组件。对应的绑定关系有:
对应的组合配置有:
1、slf4j + logback
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.14</version>
</dependency>
logback-classic-1.0.14.jar 会自动将 slf4j-api-1.7.21.jar 和 logback-core-1.0.14.jar 也引入到项目中。
2、slf4j + log4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
slf4j-log4j12-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 和 log4j-1.2.17.jar 也添加到你的项目中
3、slf4j + java.util.logging
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.21</version>
</dependency>
4、slf4j兼容非slf4j日志组件
如果项目中已经使用了common-logging,但是想用slf4j的日志组件,可以通过桥接模式,用jcl-over-slf4j.jar 把日志信息输出重定向到 slf4j-api,slf4j-api 再去调用 slf4j 实际依赖的日志组件
slf4j 兼容 common-logging
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
复制代码
slf4j 兼容 log4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
复制代码
slf4j 兼容 java.util.logging
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
5、log4j2
Log4j2 是 Log4j 和 Logback 的替代,其优势有:
- Log4j 1.x 和 Logback 都会在重新配置时丢失事件, Log4j 2 不会。在 Logback 中,Appender 中的异常永远不会对应用程序可见。在 Log4j 中,可以将 Appender 配置为允许异常渗透到应用程序。
- Log4j2 在多线程场景中,异步 Loggers 的吞吐量比 Log4j 1.x 和 Logback 高 10 倍,延迟低几个数量级。
- Log4j2 对于独立应用程序是无垃圾的,对于稳定状态日志记录期间的 Web 应用程序来说是低垃圾。
- Log4j2 使用插件系统,通过添加新的 Appender、Filter、Layout、Lookup 和 Pattern Converter,可以非常轻松地扩展框架,而无需对 Log4j 进行任何更改。
- 支持自定义日志等级。
- 支持 lambda 表达式。
- 支持消息对象。
- Log4j 和 Logback 的 Layout 返回的是字符串,而 Log4j2 返回的是二进制数组,这使得它能被各种 Appender 使用。
- Syslog Appender 支持 TCP 和 UDP 并且支持 BSD 系统日志。
- Log4j2 利用 Java5 并发特性,尽量小粒度的使用锁,减少锁的开销。
在spring-boot项目中使用log4j2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>