当前位置:主页 > 查看内容

Java技术进阶之日志

发布时间:2021-08-16 00:00| 位朋友查看

简介:日志系统的发展 我们日常接触到的日志系统有很多种 log4j JUL jdk自带 logback等 我们可以直接根据对象的日志API进行使用。但是考虑到API各不相同 所以出现了JCL Jakarta Commons Logging 、slf4j等日志API框架。日志API框架只是统一的API 其底层的具体的日……
日志系统的发展

我们日常接触到的日志系统有很多种 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中的图足以说明一切

1.png

组装日志系统

由于存在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是主流 推荐使用。

常见的日志包以及辅助包功能介绍JCL(commons-logging)系列commons-logging apache logging抽象日志工具 一般搭配log4j1/2使用
spring-jcl Spring自己的commons-logging同名类日志 Spring内部的日志调用的都是commons-logging包 优先选择Logj
jcl-over-slf4j slf4j提供的commons-logging同名日志类 通过同名类的方式替换实现方式为slf4j
SLF4j系列slf4j-api Slf4j提供的日志抽象接口 不包含实现 具体使用何种日志实现需要引入对应的实现包
slf4j-jdk14 Slfj的jdk日志实现包
slf4j-log4j12 Slf4j的log4j1/2实现包
JUL系列jul-to-slf4j Slf4j提供的jul实现包 通过jul提供的扩展接口 定制slf4j的实现
log4j系列log4j log4j v1版本的包
log4j-api log4j v2版本的包
log4j-over-slf4j Slf4j提供的log4j v1版本的同名日志类 通过同名类的方式替换实现方式为slf4j
log4j-to-slf4j log4j v2通过spi机制提供的转换至slf4j的实现
多种日志工具共存时的解决方案

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

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.LogFactorySystem.setProperty( org.apache.commons.logging.LogFactory , com.answern.claimv2.framework.log.LogFactoryImplAdapter 继承org.apache.commons.logging.LogFactory类 实现自己的LogFactory即可

还可以通过jcl提供的spi机制 实现自己的org.apache.commons.logging.LogFactory创建META-INF/services/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相应的实现库即可。

2.png

日志系统适配大全

附上一张可能是全网最全的日志框架适配图

3.png

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

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

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


本文转自网络,原文链接:https://developer.aliyun.com/article/787075
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:个人博客搭建 下一篇:没有了

推荐图文


随机推荐