Java日志体系(七)日志框架切换

 

通过 SLF4J 统一日志

在实际的日志转换过程中,SLF4J其实是充当了一个中介的角色。例如当我们一个项目原来是使用LOG4J进行日志记录,但是我们要换成LogBack进行日志记录。

此时我们需要先将LOG4J转换成SLF4J日志系统,再从SLF4J日志系统转成LogBack日志系统。

 

从日志框架转向SLF4J

  • jul-to-slf4j:jdk-logging到slf4j的桥梁
  • log4j-over-slf4j:log4j1到slf4j的桥梁
  • jcl-over-slf4j:commons-logging到slf4j的桥梁

从SLF4J转向具体的日志框架

  • slf4j-jdk14:slf4j到jdk-logging的桥梁
  • slf4j-log4j12:slf4j到log4j1的桥梁
  • log4j-slf4j-impl:slf4j到log4j2的桥梁
  • logback-classic:slf4j到logback的桥梁
  • slf4j-jcl:slf4j到commons-logging的桥梁
 
例如我们一开始使用的是 Log4J 日志框架,现在我们希望转成 LogBack 框架,那么我们首先需要加入 log4j-over-slf4j.jar 将 Log4J 转成 SLF4J,之后再加入 logback-classic.jar 将 SLF4J 转成 LogBack。
 
 
上面只是一种简单的场景,现实中我们遇到的情况却要更复杂些:我们想使用 SLF4J 的API,但是系统中已经使用了 JCL、log4j 或者 J.U.L,我们该怎么办呢?
 
SLF4J 为我们提供了从老接口切换到 SLF4J 的方法,如下图所示。
            

 

我们以图中的左上部分为例来说明下。目前的应用程序中已经使用了如下混杂方式的API来进行日志的编程:

  • commons-logging
  • log4j1
  • J.U.L

现在想统一将日志的输出交给 logback。解决方法是:

  • 第一步,先将上述日志系统的API全部无缝切换到 SLF4J
    • 去掉 commons-logging(其实去不去都可以),使用 jcl-over-slf4j 将 commons-logging 的底层日志输出切换到 SLF4J
    • 去掉 Log4j1(必须去掉),使用 log4j-over-slf4j,将 Log4j1 的日志输出切换到 SLF4J
    • 使用 jul-to-slf4j,将 J.U.L 的日志输出切换到 SLF4J
  • 第二步,让 SLF4J 绑定 Logback 来作为底层日志输出,加入以下 jar 包依赖
    • slf4j-api
    • logback-core
    • logback-classic
 

在使用Slf4j桥接时要注意避免形成死循环,在项目依赖的jar包中不要存在以下情况:

多个日志jar包形成死循环的条件 产生原因
log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在

由于slf4j-log4j12.jar的存在会将所有日志调用委托给log4j。但由于同时由于log4j-over-slf4j.jar的存在,会将所有对log4j api的调用委托给相应等值的slf4j,所以log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在会形成死循环

jul-to-slf4j.jar和slf4j-jdk14.jar同时存在

由于slf4j-jdk14.jar的存在会将所有日志调用委托给jdk的log。但由于同时jul-to-slf4j.jar的存在,

会将所有对jul api的调用委托给相应等值的slf4j,所以jul-to-slf4j.jar和slf4j-jdk14.jar同时存在会形成死循环

 



 
 
 
 
 
 
 
 

posted on 2019-08-01 23:12  曹伟雄  阅读(766)  评论(0编辑  收藏  举报

导航