日志门面概述
之前有写过Java日志框架JUL和Log4j介绍,可以对比发现它们之间的使用还是有一些区别的,比如有一些类名是不同的、日志的输出级别也不完全一致。
那么实际上是增大了日志框架与程序的耦合性,使得难以更换日志框架。
甚至会造成一些优秀的框架强制性依赖某一个具体的日志实现类,为了解决这个问题,日志门面技术就诞生了。
日志门面实质上就是提供了一套通用的日志API技术,和JDBC的思想类似,使用日志门面,就可以轻松地更换日志实现。
我们为什么要使用日志门面:
1. 面向接口开发,不再依赖具体的实现类减少代码的耦合
2. 项目通过导入不同的日志实现类,可以灵活的切换日志框架
3. 统一API,方便开发者学习和使用
4. 统一配置便于项目日志的管理
常见的日志门面:JCL、slf4j
JCL
JCL介绍
JCL全称为Jakarta Commons Logging
,是 Apache提供的一个通用日志API
它是为“所有的Java日志实现”提供一个统一的接口,它自身也提供一个日志的实现,但是功能非常常弱
(SimpleLog)。所以一般不会单独使用它。他允许开发人员使用不同的具体日志实现工具:Log4j、jdk自带的日志(JUL)。
JCL使用
maven依赖:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
如果要使用log4j还需加上log4j的依赖
核心类:
- Log:日志记录器,用于写日志
- LogFactory:日志记录器的工厂类,用于获取日志记录器。
JCL的日志级别:
- trace
- debug
- info
- warn
- error
- fatal
可以看出和log4j的日志级别一致,但它把JUL的日志级别也适配到了这套日志级别上。
对于配置文件,如果使用JUL就添加JUL的配置文件,如果使用log4j就添加Log4j的配置文件。
JCL默认会根据如下顺序查找日志的实现类:
private static final String[] classesToDiscover = {
LOGGING_IMPL_LOG4J_LOGGER,
"org.apache.commons.logging.impl.Jdk14Logger",
"org.apache.commons.logging.impl.Jdk13LumberjackLogger",
"org.apache.commons.logging.impl.SimpleLog"
};
for(int i=0; i<classesToDiscover.length && result == null; ++i) {
result = createLogFromClass(classesToDiscover[i], logCategory, true);
}
其中LOGGING_IMPL_LOG4J_LOGGER
代表的是log4j的org.apache.commons.logging.impl.Log4JLogger
,可以看到JCL支持的日志实现有:
- log4j
- jdk1.4的日志(JUL)
- jdk1.3前的LumberjackLogger(已经淘汰)
- JCL自带的SimpleLog
如果用户不指定使用哪个日志实现类,JCL会按这个顺序查找,使用最先找到的实现类。
如果需要指定,还需要添加一个配置文件commons-logging.properties
在类路径下:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
此后就可以使用了:
Log log = LogFactory.getLog(JCLTest.class);
log.info("hello JCL");
JCL的问题
JCL的问题是,当初设计的时候只考虑到了在当时比较主流的日志框架log4j、JUL,也只支持这几个日志框架,导致后面如果出现了更强大的日志框架,比如说logback出现后,如果需要使用logback,JCL需要通过修改代码的方式来适配,当然这会造成很大的麻烦。
JCL获取日志工厂的过程中使用了classLoader来寻找日志工厂实现,进而导致了其他组件,如若使用自己的classloader,则不能获取具体的日志工厂对象,则导致启动失败。(即无法动态查找)
于是不久commons-logging就退出了人们的视线,更好的日志门面技术slf4j诞生以取代它的位置。
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e6%97%a5%e5%bf%97%e9%97%a8%e9%9d%a2%e4%bb%8b%e7%bb%8d%e5%92%8cjcl%e4%bd%bf%e7%94%a8/