日志系统jar包:slf4j-api, slf4j-log4j12以及log4j

在接入日志系统的时候,通常会引入slf4j-api, slf4j-log4j12以及log4j等包,但是看他们长得都差不多,彼此之间有什么联系呢?为什么要引入这些包?不能直接接入log4j就行了吗?

首先,要知道什么是日志门面?日志门面其实就是关于日志的api,常见的有common-logging和slf4j。common-logging 是 apache 的一个开源项目,提供日志功能的 API 接口,本身并不提供日志的具体实现,而是在运行时动态的绑定日志实现组件来工作。类似于 Common-Logging,slf4j 是对不同日志框架提供的一个 API 封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,slf4j 在编译时静态绑定真正的 Log 库。

其次,有了API后,需要有具体的实现,绑定日志组件。对应的绑定关系有:

 

日志系统jar包:slf4j-api, slf4j-log4j12以及log4j_第1张图片

对应的组合配置有:

1、slf4j + logback


  ch.qos.logback
  logback-classic
  1.0.14

logback-classic-1.0.14.jar 会自动将 slf4j-api-1.7.21.jar 和 logback-core-1.0.14.jar 也引入到项目中。

2、slf4j + log4j


  org.slf4j
  slf4j-log4j12
  1.7.21

slf4j-log4j12-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 和 log4j-1.2.17.jar 也添加到你的项目中

3、slf4j + java.util.logging


  org.slf4j
  slf4j-jdk14
  1.7.21

4、slf4j兼容非slf4j日志组件

如果项目中已经使用了common-logging,但是想用slf4j的日志组件,可以通过桥接模式,用jcl-over-slf4j.jar 把日志信息输出重定向到 slf4j-api,slf4j-api 再去调用 slf4j 实际依赖的日志组件

slf4j 兼容 common-logging


  org.slf4j
  jcl-over-slf4j
  1.7.12

复制代码

slf4j 兼容 log4j


    org.slf4j
    log4j-over-slf4j
    1.7.12

复制代码

slf4j 兼容 java.util.logging


    org.slf4j
    jul-to-slf4j
    1.7.12

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

    org.springframework.boot
    spring-boot-starter-log4j2
    2.0.6.RELEASE

 

你可能感兴趣的:(java,框架技术学习)