韩光亮 2016-07-18 9546浏览量
java的日志系统繁杂,今天趁着解决日志系统冲突的过程,顺带学习一下java的日志系统并做个记录
使用JCL一般(如果是log4j可以不需要)需要一个配置commons-logging.properties在classpath上,这个文件有一行代码:
org.apache.commons.logging.LogFactory= org.apache.commons.logging.impl.LogFactoryImpl
用于通知JCL想要使用哪个日志系统。用户只要修改LogFactory的实现,就能动态的切换日志系统
slf4j的设计相对较为精巧,作者将接口以及实现分开,其中slf4j-api中定义了接口,开发者需要关心的就是这个接口,无需再关心下层如何实现,同时各个是slf4j接口的实现者只要遵循这个接口,就能够做到日志系统间的无缝兼容
有了实现,还需要一个桥接器,桥接器将对jcl的调用转接到slf4j上:
多种日志系统并不意味着程序中只能存在一种日志系统,比如log4j与logback是完全可以共存的。
目前日志系统的冲突主要分为两种:
1) 同一个日志系统的多个实现
像slf4j接口实现的冲突,如:
slf4j-log4j、logback、slf4j-jdk14、log4j2之间的冲突
这点很好理解,这几个包都实现了slf4j的接口,同一接口只能有一个实现才能被jvm正确识别
但日志系统仍然非常容易冲突,与传统的jar冲突相同,当jvm发现两个一模一样的实现的时候,它就不知道选择哪个或选择了一个错误的,就会提示ClassNotFound.
2) 桥接jar与实现包
在日志系统中,最常见的就是桥接jar包与实现包的冲突,如:
jul-to-slf4j
与 slf4j-jdk14
log4j-over-slf4j
与 slf4j-log4j
jcl-over-slf4j
与 jcl
因为转接的实现就是将其余的日志系统调用进行一个转发,既然要转发,就必须要定义与原有对象相同的类名、包名,才能正确的被调用,所以桥接jar包就必然与实现包产生冲突。
依赖关系可以见下图:
其中
标签(空格分隔): java
java的日志系统繁杂,今天趁着解决日志系统冲突的过程,顺带学习一下java的日志系统并做个记录
使用JCL一般(如果是log4j可以不需要)需要一个配置commons-logging.properties在classpath上,这个文件有一行代码:
org.apache.commons.logging.LogFactory= org.apache.commons.logging.impl.LogFactoryImpl
用于通知JCL想要使用哪个日志系统。用户只要修改LogFactory的实现,就能动态的切换日志系统
slf4j的设计相对较为精巧,作者将接口以及实现分开,其中slf4j-api中定义了接口,开发者需要关心的就是这个接口,无需再关心下层如何实现,同时各个是slf4j接口的实现者只要遵循这个接口,就能够做到日志系统间的无缝兼容
有了实现,还需要一个桥接器,桥接器将对jcl的调用转接到slf4j上:
多种日志系统并不意味着程序中只能存在一种日志系统,比如log4j与logback是完全可以共存的。
目前日志系统的冲突主要分为两种:
1) 同一个日志系统的多个实现
像slf4j接口实现的冲突,如:
slf4j-log4j、logback、slf4j-jdk14、log4j2之间的冲突
这点很好理解,这几个包都实现了slf4j的接口,同一接口只能有一个实现才能被jvm正确识别
但日志系统仍然非常容易冲突,与传统的jar冲突相同,当jvm发现两个一模一样的实现的时候,它就不知道选择哪个或选择了一个错误的,就会提示ClassNotFound.
2) 桥接jar与实现包
在日志系统中,最常见的就是桥接jar包与实现包的冲突,如:
jul-to-slf4j
与 slf4j-jdk14
log4j-over-slf4j
与 slf4j-log4j
jcl-over-slf4j
与 jcl
因为转接的实现就是将其余的日志系统调用进行一个转发,既然要转发,就必须要定义与原有对象相同的类名、包名,才能正确的被调用,所以桥接jar包就必然与实现包产生冲突。
依赖关系可以见下图:
其中
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧