转载

Java日志那些事

日志系统的发展

我们日常接触到的日志系统有很多种,log4j,JUL(jdk自带),logback等,我们可以直接根据对象的日志API进行使用。但是考虑到API各不相同,所以出现了JCL(Jakarta Commons Logging)、slf4j等日志API框架。日志API框架只是统一的API,其底层的具体的日志记录工作还是由log4j、JUL、logback等承担。

如何选择和搭配日志系统

目前来说,新应用使用logback是首选,一些老系统中很可能使用的是log4j等。目前slf4j对logback和log4j都支持,对JCL也提供了桥接方法,将JCL的api转化slf4j的API。贴一张Webx中的图足以说明一切

Java日志那些事

组装日志系统

由于存在JCL,SLF4j两大日志框架,logback、log4j、JUL日志系统所以理论上有这么多种日志系统的搭配。

  • JUL
  • log4j
  • logback
  • jcl+log4j
  • slf4j+slf4j-log4j12+log4j
  • slf4j+logback
  • jcl-over-slf4j+slf4j+logback
  • jcl-over-slf4j+slf4j+slf4j-log4j12+log4j

其中slf4j+slf4j-log4j12+log4j、slf4j+logback是主流,推荐使用。

多种日志工具共存时的解决方案

当依赖了一些三方库时,可能会出现多种日志共存的问题,无法保证每种日志抽象库都使用一样的实现类,此时需要制定固定的日志库。

主流的日志库都提供了扩展方式

JUL(java.util.logging)

通过LogManager.getLogManager().getLogger("").addHandler()方法,可以添加日志具体实现

LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());

继承java.util.logging.Handler 类,在实现中使用具体的Logger库即可

实现例子:

jul-to-slf4j( https://www.slf4j.org/api/org... )

JCL(org.apache.commons.logging)j

通过制定环境变量LogFactory,org.apache.commons.logging.LogFactory

System.setProperty("org.apache.commons.logging.LogFactory","com.answern.claimv2.framework.log.LogFactoryImplAdapter");

继承org.apache.commons.logging.LogFactory类,实现自己的LogFactory即可

还有另外一种暴力的方式:

不引入commons-logging包,而是创建jcl的一些同名类,在实现中直接使用具体的日志库。jcl-over-slf4j( https://mvnrepository.com/art... )就是一个典型的例子.

相同功能的还有spring-jcl( https://mvnrepository.com/art... )

log4j

log4j提供了java对原生spi机制的支持

建立MEATA-INF/services/org.apache.logging.log4j.spi.Provider文件

继承org.apache.logging.log4j.spi.Provider类,实现自己的LoggerContextFactory即可

实现例子:

log4j-to-slf4j( https://logging.apache.org/lo... )

SLFJ4J

slf4j官方介绍了使用方式,通过引入不同的jar包来使用具体的日志库。

由于slf4j拆分做的很好,当多种日志库共存时,若不引入slf4j-xxx.jar时,不会加载相应的日志库。

所以若日志冲突时,使用slf4j的三方库只需要include/exclude相应的实现库即可。

Java日志那些事

编写自己的框架/类库时该如何选择日志库

由于日志库多种多样,如果盲目引入jcl或者slf4j时,可能会对具体使用的项目造成影响。所以最合适的方式是内嵌一套日志抽象,内部动态的去选择加载哪个日志库。主流的成熟框架都会这么做,尽可能的保持兼容性。

例如spring/mybatis/freemarker/dubbo这些框架,都有一套内嵌的日志抽象,打印日志时只需要调用内嵌的日志即可做到全兼容。

参考

  • https://www.jianshu.com/p/54c...
  • https://www.slf4j.org/
原文  https://segmentfault.com/a/1190000018280099
正文到此结束
Loading...