2018-11-19 · Develop

Java 日志门面 - JCL

Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。

JCL能够选择使用Log4j还是JDK Logging,但是他不依赖Log4j,JDK Logging的API。如果项目的classpath中包含了log4j的类库,就会使用log4j,否则就使用JDK Logging。使用commons-logging能够灵活的选择使用那些日志方式,而且不需要修改源代码。

LogFactory 是按照下列的步骤去发现并决定那个日志工具将被使用的:

由于 J.U.L 的流行度不高,所以项目中一般使用 commons-logging 配合 log4j 实现日志功能。log4j 的配置文件 log4j.properties 对 Log4j 来说是必须的。 所以结合前一篇文章 Java 日志框架 - Log4j 我们在添加上 commons-logging 的依赖:

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

对调用方式的改造成如下:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author ZUOJL-PC
 * @version 2018/11/17 0017 15:01
 */
@Controller
public class IndexController {

    private static final Log log = LogFactory.getLog(IndexController.class);

    @RequestMapping("/")
    @ResponseBody
    public String index() {
        for (String key : System.getProperties().stringPropertyNames()) {
            log.info(String.format("%s -> %s", key, System.getProperty(key)));
        }
        return "Hello, Log4j";
    }
}

现在有个小问题是项目中引入了 log4j 和 commons-logging 的依赖,对于大型的团队如何控制每个人都使用 commons-logging 而不使用 log4j 的 api 呢?

我们知道 Maven 的依赖范围是通过 scope 属性进行控制的,我们就可以通过其进行控制:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    <scope>runtime</scope>
</dependency>

这样在调用时就不会出现 log4j 的 api 了,随便我们再来回顾下 scope 的各个值得意义: