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同时存在会形成死循环

 

原文地址:https://www.cnblogs.com/caoweixiong/p/11285988.html

时间: 2024-07-31 15:25:14

Java日志体系 —— 日志框架切换的相关文章

混乱的 Java 日志体系

混乱的 Java 日志体系 2016/09/10 | 分类: 基础技术 | 0 条评论 | 标签: LOG 分享到: 原文出处: xirong 一.困扰的疑惑 目前的日志框架有 jdk 自带的 logging,log4j1.log4j2.logback ,这些框架都自己定制了日志 API ,并且有相应的实现:目前用于实现日志统一的框架 Apache commons-logging.slf4j ,遵循「面向接口编程」的原则,这两大框架可以让用户在程序运行期间去选择具体的日志实现系统(log4j1\

Java 日志体系(二)jcl 和 slf4j

Java 日志体系(二)jcl 和 slf4j <java 日志体系(一)统一日志>:https://www.cnblogs.com/binarylei/p/9828166.html <Java 日志体系(二)jcl 和 slf4j>:https://www.cnblogs.com/binarylei/p/10781582.html 前面介绍了 jdk 自带的 logging.log4j1.log4j2.logback 等实际的日志框架.对于开发者而言,每种日志都有不同的写法.如果

Java日志体系居然这么复杂?——架构篇

摘自:https://www.cnblogs.com/xuningfans/p/12151851.html 本文是一个系列,欢迎关注 日志到底是何方神圣?为什么要使用日志框架? 想必大家都有过使用System.out来进行输出调试,开发开发环境下这样做当然很方便,但是线上这样做就有麻烦了: 系统一直运行,输出越来越多,磁盘空间逐渐被写满 不同的业务想要把日志输出在不同的位置 有些场合为了更高性能,尽量控制减少日志输出,需要动态调整日志输出量 自动输出日志相关信息,比如:日期.线程.方法名称等等

Java 日志体系

参考资料: 混乱的 Java 日志体系 Java常用日志框架介绍 Java常用的日志框架对比和深入分析

Java日志体系 —— log4j2

1.1 简介 log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相.与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础上进行的升级,解决了log4j中的一些问题,例如:多线程下性能低下.api不支持占位符{}的使用.配置文件不能自动重新加载等. 为什么说log4j在多线程情况下性能低下呢?主要是synchronized锁在作怪,当我们的log4jzai 获取appender对象时,需要进行加锁处理:而接下来对appender操作(将

Java中的日志管理

日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java.util.logging 包,JUL)和实现,直到 JDK 1.4 才被加入.因此在日志记录这一个领域,社区贡献了很多开源的实现.其中比较流行的包括 log4j 及其后继者 logback.除了真正的日志记录实现之外,还有一类与日志记录相关的封装 API,如 Apache Commons Loggi

Java Log Viewer日志查看器

工欲善其事必先利其器 在投奔怒海--一个Domino老程序员眼里的Java开发我提到目前所做的Java开发中遇到的大量日志之问题.服务器控制台刷屏似地滚动,日志文件飞快地增长,debug的时候相关信息常常被例常日志淹没,在众多Logger滔滔不绝的输出下,要找出错误所在有时都挺费眼.日志的作用无可置疑,大型项目中日志海量产生也不少见.在以前的Domino开发中,Domino服务器在产生日志方面相当节制,程序员对日志的依赖程度也不高.转换到Java开发,我用一直最喜爱的文本编辑器EditPlus肉

Java中的日志——Java.util.logging、log4j、commons-logging

Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-logging都是apache软件基金会的开源项目.这三种方式的区别如下: Java.util.logging,JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包. log4j,最强大的记录日志的方式.可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等.

Cluster的日志体系

Cluster的日志体系: Oracle cluster不像数据库那样,具有丰富的视图.工具可以用来辅助诊断,他的日志和trace文件时唯一的选择.但不想oracle只有alert日志和集中trace文件,oraclecluster的日志体系比较复杂. 4:11g R2RAC 日志 $GRID_HOME/log/: 每个节点上ORACLE集群件以及ASM存储跟踪和诊断日志文件的主目录 $GRID_HOME/log/<hostname>/: 包含本节点上oracle集群件和asm的跟踪和诊断日志