Log4j 2配置指南

前言

log4j2有8个级别,从低到高为

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

作用如下

等级 描述
All 最低等级的,用于打开所有日志记录
TRACE 追踪,就是程序运行到哪了
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的
INFO 消息在粗粒度级别上突出强调应用程序的运行过程
WARN 输出警告
ERROR 输出错误信息日志
FATAL 输出每个严重的错误事件将会导致应用程序的退出的日志
OFF 最高等级的,用于关闭所有日志记录

程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
先看一个最简单的,log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <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="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

这个配置文件主要是把程序运行过程中error级别的日志打印到控制台

根标签Configuration常用的子标签为Properties,Appenders,Loggers

Configuration常用属性 描述
monitorInterval 假设这个值是10,则每隔10秒重新读取配置文件,动态的更改配置
status 设置log4j2自身内部的信息输出

Appenders标签常用的子标签为Console,File,RollingFile

Console代表向控制台打印日志
RollingFile会根据具体的生成策略重新生成日志文件,如日志大小到了指定大小,或者到了指定时间

Console常用属性 描述
name Appender的名字
target Either “SYSTEM_OUT” or “SYSTEM_ERR”. The default is “SYSTEM_OUT”
File常用属性 描述
name Appender的名字
fileName The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.
append 值为false,则每次清空文件,为true则追加到文件,默认为true
RollingFile常用属性 描述
fileName The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.
filePattern The pattern of the file name of the archived log file(归档日志文件的文件名的模式)
SizeBasedTriggeringPolicy常用属性 描述
size 文件多大时开始翻转,后缀可为KB, MB or GB
TimeBasedTriggeringPolicy 常用属性 描述
interval 根据filePattern的最小粒度,设置翻转策略
modulate 在区间边界上翻转,值为boolean类型
maxRandomDelay 随机延迟翻转的最大秒数,默认是0,表示没有延迟
DefaultRolloverStrategy 常用属性 描述
min 计数器的最小值,默认是1
max 计数器的最大值。一旦达到这个值,旧文件将在后续翻转中删除。默认值为7

Loggers标签常用的子标签为Root,Logger,Root标签用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

Logger常用属性 描述
name 可以为随便起的名字,如果想指定某个包或者某个类的打印策略,则为包名或者全类名
level 日志打印级别

如果Logger没有指定level属性,就会默认继承自Root
Root标签和Logger标签常用的子标签为AppenderRef

AppenderRef 常用属性 描述
ref 指定日志输出的Appender

如果Logger没有指定AppenderRef ,就会默认继承自Root。如果指定了,就会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=false只在自定义的Appender中进行输出

再介绍一个常用的过滤器标签ThresholdFilter

ThresholdFilter常用属性 描述
level 日志级别
onMatch Action to take when the filter matches. May be ACCEPT, DENY or NEUTRAL. The default value is NEUTRAL
onMismatch Action to take when the filter does not match. May be ACCEPT, DENY or NEUTRAL. The default value is DENY

这里说一下可选值ACCEPT, DENY, NEUTRAL,ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,使用NEUTRAL(中立的),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。

常用模板

我们在项目中一般不直接使用Log4j2而是SLF4J。SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类,SLF4J类似JDBC,这样我们可以轻松更改日志的实现,一般在pom文件中加入如下即可

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

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.13</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.5</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>

lombok是一个神奇插件,在类上加上@Slf4j 注解,就相当于在类中加入如下代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger log = LoggerFactory.getLogger(类名.class);

将指定包或者指定类的日志打印到特定文件

设置Logger标签的name属性为包名或者全类名,即可把日志打到相应的文件中

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <File name="logFile" fileName="${logDir}/server.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="classFile" fileName="${logDir}/classFile.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
    </Appenders>

    <Loggers>
        <Logger name="com.test1.TestLog">
            <AppenderRef ref="classFile" />
        </Logger>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
        </Root>
    </Loggers>

</Configuration>

将不同级别的日志打印到特定文件

主要思路是,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能颠倒

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
        <!-- 定义日志输出的格式,具体含义可参考官网 -->
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <File name="logFile" fileName="${logDir}/server.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="debugFile" fileName="${logDir}/debug.log" append="false">
            <Filters>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="infoFile" fileName="${logDir}/info.log" append="false">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="errorFile" fileName="${logDir}/error.log" append="false">
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
    </Appenders>

    <Loggers>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
            <AppenderRef ref="debugFile" />
            <AppenderRef ref="infoFile" />
            <AppenderRef ref="errorFile" />
        </Root>
    </Loggers>

</Configuration>

这个是把不同level的日志写到相应的文件中,并把所有日志写到logFile文件中

按时间或者大小归档

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <RollingFile name="logFile" fileName="${logDir}/server.log" filePattern="${logDir}/server-%d{yyyyMMddHH}.log.gz">
            <PatternLayout>
                <pattern>${filePattern}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="24" modulate="true" />
                <!--<SizeBasedTriggeringPolicy size="10MB" />-->
            </Policies>
            <DefaultRolloverStrategy max="30" />
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
        </Root>
    </Loggers>

</Configuration>

每天零点归档日志,文件名类似如下server-2018041123.log.gz,当日志达到30个以后,删除以前的日志

参考博客

[1]https://blog.csdn.net/weixin_40135537/article/details/78936054
[2]https://blog.csdn.net/q343509740/article/details/79726708
[3]https://www.cnblogs.com/hafiz/p/6170702.html
[4]https://blog.csdn.net/chenhaotong/article/details/50487557
[5]http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html

猜你喜欢

转载自blog.csdn.net/zzti_erlie/article/details/80437683
今日推荐