工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~

沙海 2021年6月18日04:42:44Java评论20字数 2903阅读9分40秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/33726.html

本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到"日志打不出"或者"日志jar包冲突"等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。它只提供一套通用的日志接口api,并不提供日志的实现。记得去掉无用的日志实现组件,只保留你要用的。没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。文章源自JAVA秀-https://www.javaxiu.com/33726.html

原文约 2039 | 图片 13 | 建议阅读 5 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~

点击关注 ? Java面试那些事儿 文章源自JAVA秀-https://www.javaxiu.com/33726.html

大家好,我是D哥文章源自JAVA秀-https://www.javaxiu.com/33726.html

点击关注下方公众号,Java面试资料 都在这里

文章源自JAVA秀-https://www.javaxiu.com/33726.html

作者:Alben文章源自JAVA秀-https://www.javaxiu.com/33726.html

源:albenw.github.io/posts/854fc091/文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 概要

文章源自JAVA秀-https://www.javaxiu.com/33726.html

本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志jar包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

# Log日志体系

文章源自JAVA秀-https://www.javaxiu.com/33726.html

在日常工作中我们可能看到项目中依赖的跟日志相关的jar包有很多,commons-logging.jar、log4j.jar、sl4j-api.jar、logback.jar等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 背景/发展史

文章源自JAVA秀-https://www.javaxiu.com/33726.html

那就要从Java Log的发展历程开始说起。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

  1. log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目文章源自JAVA秀-https://www.javaxiu.com/33726.html

  2. Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JUL(java.util.logging)文章源自JAVA秀-https://www.javaxiu.com/33726.html

  3. 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。文章源自JAVA秀-https://www.javaxiu.com/33726.html

  4. Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。文章源自JAVA秀-https://www.javaxiu.com/33726.html

  5. 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不替供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。文章源自JAVA秀-https://www.javaxiu.com/33726.html

  6. Apache参考了logback,并做了一系列优化,推出了log4j2文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 关系/依赖

文章源自JAVA秀-https://www.javaxiu.com/33726.html

大概了解心路历程后,再详细看看它们之间的关系、依赖。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

JCL

文章源自JAVA秀-https://www.javaxiu.com/33726.html

commons-logging已经停止更新,最后的状态如下所示:文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~文章源自JAVA秀-https://www.javaxiu.com/33726.html

JCL支持日志组件不多,不过也有很人用的,例如Spring文章源自JAVA秀-https://www.javaxiu.com/33726.html

现在用的也越来越少了,也不多讲了文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

SLF4J

文章源自JAVA秀-https://www.javaxiu.com/33726.html

因为当时Java的日志组件比较混乱繁杂,Ceki Gülcü推出slf4j后,也相应为行业中各个主流日志组件推出了slf4j的适配文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~文章源自JAVA秀-https://www.javaxiu.com/33726.html

图的意思为如果你想用slf4j作为日志门面的话,你如何去配合使用其他日志实现组件,这里说明一下(注意jar包名缺少了版本号,在找版本时也要注意版本之间是否兼容)文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • slf4j + logbackslf4j-api.jar + logback-classic.jar + logback-core.jar文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • slf4j + log4jslf4j-api.jar + slf4j-log4j12.jar + log4j.jar文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • slf4j + julslf4j-api.jar + slf4j-jdk14.jar文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • 也可以只用slf4j无日志实现slf4j-api.jar + slf4j-nop.jar文章源自JAVA秀-https://www.javaxiu.com/33726.html

SLF4J的适配

文章源自JAVA秀-https://www.javaxiu.com/33726.html

slf4j支持各种适配,无论你现在是用哪种日志组件,你都可以通过slf4j的适配器来使用上slf4j。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

只要你切换到了slf4j,那么再通过slf4j用上实现组件,即上面说的。文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~文章源自JAVA秀-https://www.javaxiu.com/33726.html

其实总的来说,无论就是以下几种情况文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • 你在用JCL使用jcl-over-slf4j.jar适配文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • 你在用log4j使用log4j-over-slf4j.jar适配文章源自JAVA秀-https://www.javaxiu.com/33726.html

  • 你在用JUL使用jul-to-slf4j.jar适配文章源自JAVA秀-https://www.javaxiu.com/33726.html

我在网上盗一张图,给大家一个整体的依赖图(懒得画了)文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 让Spring统一输出文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

这就是为了对slf4j的适配做一个例子说明。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

Spring是用JCL作为日志门面的,那我们的应用是slf4j + logback,怎么让Spring也用到logback作为日志输出呢?这样的好处就是我们可以统一项目内的其他模块、框架的日志输出(日志格式,日志文件,存放路径等,以及其他slf4j支持的功能)文章源自JAVA秀-https://www.javaxiu.com/33726.html

很简单,就是加入jcl-over-slf4j.jar就好了。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

我又整了一个图来说明文章源自JAVA秀-https://www.javaxiu.com/33726.html

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~文章源自JAVA秀-https://www.javaxiu.com/33726.html

适配思路文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

其实很简单文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

  1. 你首先确认需要统一日志的模块、框架是使用哪个日志组件的,然后再找到sfl4j的适配器。文章源自JAVA秀-https://www.javaxiu.com/33726.html

  2. 记得去掉无用的日志实现组件,只保留你要用的。文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 常见问题

文章源自JAVA秀-https://www.javaxiu.com/33726.html

slf4j的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

slf4j已经对错误作了说明:文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

http://www.slf4j.org/codes.html文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

下面讲一下可能经常遇到的问题文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

Failed to load class org.slf4j.impl.StaticLoggerBinder

文章源自JAVA秀-https://www.javaxiu.com/33726.html

没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

Multiple bindings

文章源自JAVA秀-https://www.javaxiu.com/33726.html

找到多个日志实现,slf4j会找其中一个作为日志实现。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 代码规范

文章源自JAVA秀-https://www.javaxiu.com/33726.html

阿里对此的代码规范:文章源自JAVA秀-https://www.javaxiu.com/33726.html

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(Abc.class);文章源自JAVA秀-https://www.javaxiu.com/33726.html

# 总结

文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章帮大家梳理了Java日志组件的关系,以及如何解决日常中常见日志相关的问题,希望对大家帮助。文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

文章源自JAVA秀-https://www.javaxiu.com/33726.html

技术交流群有不少同学问D哥,大厂面试官到底喜欢问什么?想进大厂镀金。因此,D哥特意邀请了华为、腾讯、阿里的朋友进群,与大家一起交流经验,增长技术。有兴趣入群的同学,可长按扫描下方二维码,一定要备注:城市+昵称+技术方向,根据格式备注,可更快被通过且邀请进群。▲长按扫描

工作3年啦,你竟然连Java日志体系都没闹懂?说不过去~热门推荐文章源自JAVA秀-https://www.javaxiu.com/33726.html

Windows11提前曝光!网友:就这,一股苹果味。。。微信红包的CAP,贼牛逼啊!全网疯传:如何把SpringBoot的Jar包做成exe?网友:有点钢~
文章源自JAVA秀-https://www.javaxiu.com/33726.html
继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定