资讯专栏INFORMATION COLUMN

Java日志那些事

GeekQiaQia / 3109人阅读

摘要:但是考虑到各不相同,所以出现了等日志框架。日志框架只是统一的,其底层的具体的日志记录工作还是由等承担。如何选择和搭配日志系统目前来说,新应用使用是首选,一些老系统中很可能使用的是等。所以若日志冲突时,使用的三方库只需要相应的实现库即可。

日志系统的发展

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

组装日志系统

由于存在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.LogFactory
System.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相应的实现库即可。

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

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

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

参考

https://www.jianshu.com/p/54c...

https://www.slf4j.org/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73415.html

相关文章

  • 广发银行运维实践分享:Docker适配传统运维那些

    摘要:所以借鉴大家惯用的传统运维思路,并配有一个与以前传统对接的点,广发银行有如下几个做法第一,操作系统。所以广发使用了一个配置文件包。版本流程这是广发银行持续集总的框架。 数人云上海&深圳两地容器之Mesos/K8S/Swarm三国演义的嘉宾精彩实录第一弹来啦。今天是广发银行数据中心的运维老兵沈伟康关于传统运维与容器适配的全方位分享,万字长文倾情奉上~ 沈伟康,广发银行数据中心 运维中年人...

    taoszu 评论0 收藏0
  • nginx配置那些

    摘要:如果日志没有马上显示,使用来重启服务。出现问题一定要看日志与访问时,访问附件等于附件 随着项目的跟近,与nginx打的交道越来越多,现将遇到的问题记录如下: 相对路径 在进行路径定义时,是否可以使用相对路径? NO 绝对不能够使用相对路径 日志 # 根级别 error_log /var/logs/error.log warn; http { log_format main...

    wthee 评论0 收藏0
  • 【面试】Java基础中的那些-One

    摘要:前言面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些面试中的事,不会很详细,但是应该比较全面吧。 前言 面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些java面试中的事,不会很详细,但是应该比较全面吧。 主要内容 说到...

    Stardustsky 评论0 收藏0
  • 谈谈Java引用和Threadlocal的那些

    摘要:容易导致内存泄漏。如果我们的强引用不存在的话,那么就会被回收,也就是会出现我们没被回收,被回收,导致永远存在,出现内存泄漏。缓存行和一次定位,不会有冲突由于使用数组,不会出现回收,没被回收的尴尬局面,所以避免了内存泄漏。 1 背景 某一天在某一个群里面的某个群友突然提出了一个问题:threadlocal的key是虚引用,那么在threadlocal.get()的时候,发生GC之后,ke...

    justjavac 评论0 收藏0
  • Java那些(一)——访问级别修饰符

    摘要:老夫的老夫的主页谢谢阅读那点事访问级别修饰符注本文讨论的所有情况没有考虑嵌套类。这种访问级别是范围最大的,当泥萌使用该修饰符修饰类的成员的时候,代表该成员可以被所有类访问,即整个项目下都是可以访问的。 老夫的gayhub老夫的主页谢谢阅读 Java那点事-访问级别修饰符 注:本文讨论的所有情况没有考虑嵌套类。 Java的访问级别修饰符(Access Level Modifiers)有四...

    Render 评论0 收藏0

发表评论

0条评论

GeekQiaQia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<