开始log4j 2

我接触一项技术,会先学习如何使用它。这篇网志作为学习 log4j 2 的开始。

2012年,log4j 进行了重大改进,重写 log4j,并将项目命名为 log4j 2,并且与 log4j 不兼容。7月发布 2.0-alpha1 版本,我用的是 2.0-beta4 版。

第一个程序——Hello World

public class Hello {

    private static Logger logger = LogManager.getLogger("com.foo.Hello");
    
    public static void main(String[] args) {
        logger.info("hello world");
    }
}

代码很简单,首先获得日志类实例 logger,所有的操作都将通过 logger 来完成。这里我打印了一条 info 级别的信息,log4j 2 定义了 debug、info、error 等日志级别,不同的级别调用不同的方法。

接下来是配置日志,log4j 之前的配置文件是 log4j.properties 或是 log4j.xml,现在是 log4j2.xml。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </appenders>
    <loggers>
        <root level="info">
            <appender-ref ref="Console" />
        </root>
    </loggers>
</configuration>

配置文件很直观(比 log4j.properties 的可读性更强),简单来看,它定义了两个东西:appender 和 logger,这也是 log4j 2 的核心概念。

appender 负责日志输出的具体实现,你可以配置一些参数,比如日志输出位置(控制台、文件、网络),日志输出格式。

<appenders> 标签里可以配置多个appender,用 name 属性标识它们。这样,可以为不同的场景配置不同的输出实现。

logger 这里只配了一个实例,即 root,所有未指定的实例默认交给 root 完成日志输出。日志级别配置为 info,大于或等于这个级别的日志都会被输出

运行结果

18:09:48.796 [main] INFO  tutorial.Hello - hello world

<loggers> 标签里的配置也可以对应多个 logger 实例:

<loggers>
    <logger name="tutorial.Hello" level="debug">
        <appender-ref ref="Console" />
    </logger>
    <root level="info">
        <appender-ref ref="Console" />
    </root>
</loggers>

如上代码,具体是通过 name 属性对应于代码中的 logger(即 Hello 类中使用的那个 logger)。

这种方式大大提高了灵活性、场景适应能力。之前提过,不同的场景可能需要不同的输出实现,当我们要改变某个类的输出实现时,只需要在 <loggers> 标签里配置相应的输出实现即可。

原文地址:https://www.cnblogs.com/huangyp/p/2990471.html