Common Logging 日志门面

Commons Logging 是早期的一款日志门面,官方对其的介绍是这样的:

The Apache Commons Logging (JCL) provides aLoginterface that is intended to be both light-weight and an independent abstraction of other logging toolkits. It provides the middleware/tooling developer with a simple logging abstraction, that allows the user (application developer) to plug in a specific logging implementation.

通过Commons Logging API ,应用程序可以在不修改代码的情况下完成底层日志框架的更改。

Commons Logging 内部有一个简单的日志实现,但是功能很弱,一般仅测试使用。

Commons Logging 有两个基本数据结构:

  • Log接口: 日志记录器
  • LogFactory抽象类: 日志工厂(负责创建Log实例)

工程配置

Commons Logging 使用日志实现的原则是,倘若没有定义日志实现,则默认使用JUL日志框架作为日志实现,如果有log4j,则优先使用log4j作为日志实现。

使用JUL作为日志实现

使用JUL作为日志实现,仅需在maven工程中导入如下依赖:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

可以观察到程序运行结果,就是JUL的日志输出形式。

使用Log4j作为日志实现

Log4j 是 Commons Logging 的首选日志实现框架,在maven工程中导入如下依赖,默认就会使用Log4j日志实现。(当然需要提供Log4j必要的配置文件,如log4j.properties)

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

可以看到,仅仅导入了Log4j的依赖,在代码未更改的情况下,日志输出形式已经变成了Log4j的样式。

日志实现的加载顺序

Commons Logging 使用Log接口指示其背后的日志记录器具体实现,查看类图,可以看到,Commons Logging 主要作为如下几种日志实现的门面。

具体使用哪种日志实现,由静态方法LogFactory.getLog() 决定。

查看源码,LogFactory.getLog() -> getFactory().getInstance() -> getInstance() ->newInstance() -> discoverLogImplementation() 方法中,可以看到

LogFactory通过遍历classesToDiscover数组,查找日志的具体实现

由此可以得到Commons Logging加载日志实现的顺序是 Log4j > JUL > SimpleLog。

classesToDiscover数组列举出来的类名,就是各个日志实现相对Commons Logging的适配器。适配器是Commons Logging中Log接口的一个实现。

日志级别

Commons Logging 本身没有办法控制日志级别。日志级别的控制依赖具体日志框架。不过Commons Logging的日志输出级别与底层日志实现有特定关系:

Commons Logging的日志级别对应的Log4j日志级别对应的JUL日志级别
traceTRACEFINEST
debugDEBUGFINE
infoINFOINFO
warnWARNWARNING
errorERRORSEVERE
fatalFATALSEVERE

编辑于 2022-01-07 20:14