网站首页 > java教程 正文
概要
本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志jar包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。
Log日志体系
在日常工作中我们可能看到项目中依赖的跟日志相关的jar包有很多,commons-logging.jar、log4j.jar、sl4j-api.jar、logback.jar等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。
背景/发展史
那就要从Java Log的发展历程开始说起。
- log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目
- Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JUL(java.util.logging)
- 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。
- Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。
- 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不替供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。
- Apache参考了logback,并做了一系列优化,推出了log4j2
关系/依赖
大概了解心路历程后,再详细看看它们之间的关系、依赖。
JCL
commons-logging已经停止更新,最后的状态如下所示:
JCL支持日志组件不多,不过也有很人用的,例如Spring 现在用的也越来越少了,也不多讲了
SLF4J
因为当时Java的日志组件比较混乱繁杂,Ceki Gülcü推出slf4j后,也相应为行业中各个主流日志组件推出了slf4j的适配 图来源于官方文档(https://www.slf4j.org/manual.html)
图的意思为如果你想用slf4j作为日志门面的话,你如何去配合使用其他日志实现组件,这里说明一下(注意jar包名缺少了版本号,在找版本时也要注意版本之间是否兼容)
- slf4j + logback slf4j-api.jar + logback-classic.jar + logback-core.jar
- slf4j + log4j slf4j-api.jar + slf4j-log4j12.jar + log4j.jar
- slf4j + jul slf4j-api.jar + slf4j-jdk14.jar
- 也可以只用slf4j无日志实现 slf4j-api.jar + slf4j-nop.jar
SLF4J的适配
slf4j支持各种适配,无论你现在是用哪种日志组件,你都可以通过slf4j的适配器来使用上slf4j。只要你切换到了slf4j,那么再通过slf4j用上实现组件,即上面说的。图来源于官方文档(https://www.slf4j.org/legacy.html)
其实总的来说,无论就是以下几种情况
- 你在用JCL 使用jcl-over-slf4j.jar适配
- 你在用log4j 使用log4j-over-slf4j.jar适配
- 你在用JUL 使用jul-to-slf4j.jar适配
我在网上盗一张图,给大家一个整体的依赖图(懒得画了)
让Spring统一输出
这就是为了对slf4j的适配做一个例子说明。Spring是用JCL作为日志门面的,那我们的应用是slf4j + logback,怎么让Spring也用到logback作为日志输出呢?这样的好处就是我们可以统一项目内的其他模块、框架的日志输出(日志格式,日志文件,存放路径等,以及其他slf4j支持的功能) 很简单,就是加入jcl-over-slf4j.jar就好了。我又盗了一个图来说明
适配思路
其实很简单
- 你首先确认需要统一日志的模块、框架是使用哪个日志组件的,然后再找到sfl4j的适配器。
- 记得去掉无用的日志实现组件,只保留你要用的。
常见问题
slf4j的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。slf4j已经对错误作了说明官网说明(https://www.slf4j.org/codes.html) 下面讲一下可能经常遇到的问题
Failed to load class org.slf4j.impl.StaticLoggerBinder
没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。
Multiple bindings
找到多个日志实现,slf4j会找其中一个作为日志实现。
代码规范
阿里对此的代码规范:
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class);
总结
文章帮大家梳理了Java日志组件的关系,以及如何解决日常中常见日志相关的问题,希望对大家帮助。
猜你喜欢
- 2024-11-12 java日志那些事儿-日志野史(java 日志包)
- 2024-11-12 大厂都是如何解决Java日志级别,重复记录、丢日志问题?
- 2024-11-12 五年Java经验,面试还是说不出日志该怎么写更好?
- 2024-11-12 Java常用日志框架总结(java的日志框架)
- 2024-11-12 java日志组件(java 日志系统)
- 2024-11-12 java打日志超简单(java如何输出日志)
- 2024-11-12 Java企业级项目的日志规范(java企业级项目的日志规范有哪些)
- 2024-11-12 小白也能看懂Java 日志体系(SLF4J)
- 2024-11-12 开发须知:开发者须知的4类Java日志
- 2024-11-12 谈谈日志的最佳实践(谈谈日志的最佳实践方式)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)