-
- 先看一下专业术语
Facade:点击打开链接
- 要想理解某个东西,必须要了解这个东西的历史,首先大致介绍历史
最先出现的是apache的log4j,当时这个日志是应用最广泛的日志工具,成为标杆
有了标杆,就有了追赶者,Sun公司在jdk1.4中加入JUL日志实现,就是jdk自带的java.util.logging
由于两方面不像utf字符编码创建者和UCS编码那样和谐供出了,两方面一直在较量,没有关联,造成了混乱
紧接着,jcl(Jakarta Commons Logging或者Apache Commons logging)出现了,这个日志框架,既兼容了之前主流的日志实现,也有自己的日志实现,基本上一统江湖了,但是仍然有很多冲突。spring也依赖了jcl
后来slf4j(simple logging facade for java)横空出世,slf4j就是log4j的作者进一步开发出来的,他觉得jcl不够好,slf4j这不是具体的日志解决方案,只服务于各种各样的日志系统,也就是提供接口,不影响用户最终选择哪种日志系统,比较适合灵活切换日志系统,此时此刻,兼容了主流的日志实现,这个时候市场上比较好兼容处理了,并且slf4j有了自己的日志实现,但是名字不像之前的各种日志框架都名字一样, 而是叫logback,logback是比较好用的日志实现。 - 学完了各种历史,来看看目前主流的这个日志体系结构图
这个图只是大体上的体系,日志接口层都用slf4j都有利于简化处理 - slf4j是java的简单日志门面,不是具体的日志解决方案,只服务于各种各样的slf4j-log的日志系统,log就是包括主流的四种日志实现层方式,java.util.logging,logback,log4j,common-logging,slf4j是一个用于日志的简单Facade(门面设计模式)
在接口桥接器和实现桥接器中,是不需要在代码中或者配置文件中指定的,只需要在项目中加入指定的log-slf4j-log包即可,但是日志的是需要配置文件的,这个与IOC思想有点类似
接口桥接器
jul-to-slf4j:jdk-logging到slf4j的桥梁
log4j-over-slf4j:log4j1到slf4j的桥梁
jcl-over-slf4j:commons-logging到slf4j的桥梁
举例:比如使用log4j的API进行编程,但最终用logback来进行输出,所以就需要先将log4j1的日志输出转交给slf4j来输出,slf4j再交给logback来输出。这就是log4j-over-slf4j做的事实现桥接器
slf4j-jdk14:slf4j到jdk-logging
slf4j-log4j12:slf4j到log4j1
log4j-slf4j-impl:slf4j到log4j2
logback-classic:slf4j到logback
slf4j-jcl:slf4j到commons-logging
接口桥接器
slf4j-api(接口层)
各日志实现包的连接层,桥接层( slf4j-jdk14, slf4j-log4j)
各日志实现包
- 现在举一个例子,之前你的日志实现是jcl,现在想要给转化为logback,你应该怎么做呢
- 需要导入jcl-over-slf4j-1.6.2jar包,用于桥接commons-logging到slf4j,如果是logback到slf4j,都不用引桥接器的
- 需要导入slf4j这个日志转化系统,就是slf4j-api-1.5.11.jar
- 需要导入实现桥接器,也就是各日志实现包的连接层,slf4j-log4j12-1.5.11.jar,这里还需要做一个路径上的配置,这个是maven里面导入jar包的依赖
- 需要在maven的pom.xml文件中加入logback对应的jar包,logback-core-0.9.29.jar,logback-classic-0.9.29.jar,(这里有注意的,导入其他的包里面经常是包含logback或者其他日志实现的包,这里应该要将其排除掉,防止会起冲突)
- 最后要将你的logback.xml配置好,logback会一次读取logback.groovy,logback-test.xml,logback.xml(logback.xml与logback.groovy之间可以互相转化,logback.groovy转化成logback.xml 点击打开链接)
- 参考: logback.xml文件详细说明 点击打开链接 https://my.oschina.net/looly/blog/298675
- 参考: logback配置的详细说明 点击打开链接 http://www.cnblogs.com/warking/p/5710303.html
- pom.xml文件配置参考:
-
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency>
-
<dependency> <groupId>abc.common</groupId> <artifactId>common-rpc</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> //比如这里需要排除掉其他的桥接器jar包 </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> //排除掉其他的logback实现的jar包,应该版本可能要求不一样 </exclusion> </exclusions> </dependency>
- 但是一直会有一个问题值得注意
- 就是slf4j是的作用是桥接转化两个不同的日志实现方案,因此转化两个相同的日志实现方法,就会出现死循环,发生冲突
-
jcl-over-slf4j 与 slf4j-jcl 冲突,log4j-over-slf4j 与 slf4j-log4j12 冲突 ,jul-to-slf4j 与 slf4j-jdk14 冲突,而且从slf4j到slf4j以及slf4j到logback是不需要桥接的,但是logback.xml的配置文件是需要有的。
- 先看一下专业术语
java日志相关架构
最新推荐文章于 2024-09-25 10:59:43 发布