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常用属性描述
nameAppender的名字
targetEither “SYSTEM_OUT” or “SYSTEM_ERR”. The default is “SYSTEM_OUT”
File常用属性描述
nameAppender的名字
fileNameThe 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常用属性描述
fileNameThe name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.
filePatternThe 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日志级别
onMatchAction to take when the filter matches. May be ACCEPT, DENY or NEUTRAL. The default value is NEUTRAL
onMismatchAction 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java识堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值