2018-12-13 · Develop

Java 日志框架 - log4j2

今天开始讲下 Java 的又一个日志框架 log4j2 。Log4j2是Log4j的升级版,与之前的版本Log4j 1.x相比、有重大的改进,修正了Logback固有的架构问题的同事,改进了许多Logback所具有的功能。

使用

1. 添加依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.9.0</version>
</dependency>

2. 编写代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Controller
public class IndexController {

    private static final Logger log = LogManager.getLogger(IndexController.class);

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

3. 添加配置

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="ALL" monitorInterval="30">

    <properties>
        <property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n</property>
        <property name="LOG_PATH">${sys:catalina.home}/logs/${date:yyyy-MM}</property>
    </properties>

    <appenders>
        <!--STDOUT-->
        <console name="STDOUT" target="SYSTEM_OUT">
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
        </console>

        <!--DEBUG FILE-->
        <RollingFile name="RollingFileDebug" fileName="${LOG_PATH}/${hostName}-debug.log" filePattern="${LOG_PATH}/${hostName}-%d{yyyy-MM-dd}-%i-debug.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> 
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="ALL">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="RollingFileDebug"/>
        </root>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="INFO"/>
        <logger name="org.springframework" level="INFO"/>
    </loggers>
</configuration>

配置详解

log4j2 查找配置的顺序 log4j2-text.xml -> log4j2.xml 。
日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

configuration

Configuration 根节点,有两个属性。

properties

log4j2 通过 property 来定义变量,获取变量则使用 ${name} 的方式,除了在配置文件中定义的属性外,还有很多其他的属性, log4j2 支持使用 ${prefix:name} 的方式进行获取。
前缀标识符代表了这个属性来自哪个特定的地方。下图是比较常用的几个前缀,使用例子请看 文档的这里

appenders

常见的有三种子节点: Console 、 RollingFile 、 File 。

1. Console

Console 节点用来定义输出到控制台的 Appender 。

2. File

File 节点用来定义输出到指定位置的文件的 Appender 。其中 fileName 指定输出日志的目的文件带全路径的文件名。

3. RollingFile

RollingFile 节点用来定义超过指定大小自动删除旧的创建新的的 Appender 。

loggers

Loggers节点,常见的有两种: Root 和 Logger 。