代码里的日志闹脾气?Log4j 老了Logback 小弟来救场!程序员必看!

代码里的日志闹脾气?Log4j 老了Logback 小弟来救场!程序员必看!

精选文章moguli202025-05-25 23:21:053A+A-




今天咱聊点程序员圈里的事儿!你电脑里跑的那些软件、App,背后都有一堆代码在吭哧吭哧干活。为了知道它们干得好不好、有没有偷懒犯错,程序员会给它们装上“小喇叭”——这就是日志系统

啥是日志?

简单说,就是代码运行的时候,把自己干了啥、遇到啥问题,都一五一十记下来。比如“用户张三登录成功”、“哎呀,数据库连不上了”、“给李四转账100块完成”……这些都是日志。关键时刻,查日志能救命,快速找到问题在哪!

老员工 Log4j 和 小灵通 Commons Logging 的“办公室恋情”?

很多老项目里,有两个写日志的“老员工”:

  1. Log4j (读作:log-four-jay):资格老,能力强,很多年前大家伙都用它。它有个专属的“工作手册”叫 log4j.xml,里面写着日志该怎么记、记到哪儿。
  2. Commons Logging (简称 JCL):像个“传话筒”,自己不干活,专门帮别人传话给 Log4j 这类实际干活的。

本来它俩应该合作愉快,JCL 传话,Log4j 干活。但最近发现,JCL 这小子有点“飘”,不好好给 Log4j 传话了!明明 log4j.xml 里写得清清楚楚,日志要记到A文件,结果 JCL 产生的日志,压根不理 log4j.xml,不知道野到哪里去了!

程序员小王遇到的糟心事:

“我这项目,Log4j 自己写的日志,乖乖听 log4j.xml 的话,都进了一个叫 app.log 的文件。但那些用 Commons Logging (JCL) 写的日志,就像断了线的风筝,log4j.xml 根本管不住它们!查问题老费劲了!” 小王抱怨道。

为啥 JCL “不听话”了?背后有“小三”!

经过一番“侦查”,原来是项目里来了个“小鲜肉”——Logback,还带了个“经纪人”——SLF4J (读作:S-L-F-four-jay)。

  • SLF4J:也是个“传话筒”,但比 JCL 更受欢迎,更现代。
  • Logback:是 SLF4J 的黄金搭档,干活麻利,配置灵活。

问题就出在,项目里可能偷偷混入了一个叫 jcl-over-slf4j 的“间谍包”。它的作用是:把所有 JCL 的“传话”,都偷偷转给了 SLF4J!

然后呢?SLF4J 一看,呀,我兄弟 Logback 也在!于是,所有话都传给了 Logback。

所以,流程变成了:

  1. 你的代码用 JCL (Commons Logging) 写日志。
  2. jcl-over-slf4j (间谍包) 拦截,把日志请求转给 SLF4J (新传话筒)。
  3. SLF4J 发现 Logback (新干活的) 在,就把活儿派给 Logback。
  4. Logback 只认自己的“工作手册”(比如 logback.xml),根本不鸟 Log4j 的 log4j.xml!

结果: log4j.xml 只能管住直接用 Log4j API 写的日志,管不住被“策反”的 JCL 日志。

咋办?老员工要退休,新人要上位!

Log4j 1.x 年纪大了,官方都不更新维护了(就像 Windows XP 一样)。现在流行的是 SLF4J + Logback (或者 SLF4J + Log4j2,这是 Log4j 的新一代)。

解决方案:给日志系统来个“大换血”!

  1. 请走老员工:把项目里旧的 log4j-1.x.jar 和 commons-logging.jar 请出去(从项目配置里删掉)。
  2. 扶正 SLF4J 和 Logback:确保项目里有 slf4j-api.jar 和 logback-classic.jar。
  3. 用好“间谍包”:保留或添加 jcl-over-slf4j.jar (让 JCL 的日志也归 SLF4J 管) 和 log4j-over-slf4j.jar (让那些还在用老 Log4j API 的代码也归 SLF4J 管)。
  4. 统一“工作手册”:扔掉 log4j.xml,新建一个 logback.xml。把原来 log4j.xml 里的规矩,翻译成 Logback 能听懂的话,写到 logback.xml 里。

简单说,就是:
以后项目里所有写日志的请求,不管是老的还是新的API,都先通过 SLF4J 这个统一的“传话筒”,然后由 Logback 这个唯一的“实干家”来记录。这样,只需要一个 logback.xml 配置文件,就能管理所有日志了!

log4j.xml 变身 logback.xml 魔法(简化版):

  • log4j.xml 里写 <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
  • logback.xml 里对应写 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> (注意类名变了)
  • log4j.xml 里写 <param name="File" value="app.log"/> 和 <param name="DatePattern" value="'.'yyyy-MM-dd"/> (每天一个日志文件)
  • logback.xml 里对应写 <file>app.log</file> 和 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>app.log.%d{yyyy-MM-dd}</fileNamePattern> </rollingPolicy>
  • log4j.xml 里写 <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %p %m%n"/> </layout> (日志格式)
  • logback.xml 里对应写 <encoder> <pattern>%d %p %m%n</pattern> </encoder>

(具体转换规则还有更多细节,但大体思路是这样。)

程序员小王的春天来了:
换上 SLF4J + Logback 后,小王只需要维护一个 logback.xml,所有日志都乖乖听话,想怎么记就怎么记,想记到哪儿就记到哪儿。查问题、看系统状态,效率杠杠的!

老铁们,如果你也是程序员,或者对软件怎么跑的感兴趣,记住:
日志很重要!一个清晰、统一的日志系统,能省大事儿!如果你项目里还在用老掉牙的 Log4j 1.x 和混乱的日志配置,赶紧考虑升级到 SLF4J + Logback/Log4j2 吧!拥抱新技术,干活更轻松!

觉得有用,点个赞,转给身边的程序员朋友看看呗!
#程序员 #编程 #Java #日志 #Log4j #Logback #避坑指南

点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2