log4j2生产环境配置

时间:2022-02-16 21:52:24
<?xml version="1.0" encoding="UTF-8"?>
<!-- status="debug" 可以查看log4j的装配过程-->
<!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF -->
<Configuration status="OFF" xmlns:log4j='http://jakarta.apache.org/log4j/2.x/'>

<Properties>
<Property name="TEST_LOG_ROOT">H:\logs</Property>
</Properties>

<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%p] %m%n"/>
</Console>
<RollingFile name="TEST_DEBUG" fileName="${sys:TEST_LOG_ROOT}/TEST_debug.log" filePattern="${sys:TEST_LOG_ROOT}/TEST_debug_%d{yyyy_MM_dd}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%c %M %L]-[%p] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

<DefaultRolloverStrategy max="7"/>

</RollingFile>
<RollingFile name="TEST_INFO" fileName="${sys:TEST_LOG_ROOT}/TEST_info.log" filePattern="${sys:TEST_LOG_ROOT}/TEST_info_%d{yyyy_MM_dd}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%c %M %L]-[%p] %m%n"/>
<Policies>
<!-- 每天一个文件 -->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<DefaultRolloverStrategy max="7"/>

</RollingFile>
<RollingFile name="TEST_WARN" fileName="${sys:TEST_LOG_ROOT}/TEST_warn.log" filePattern="${sys:TEST_LOG_ROOT}/TEST_warn_%d{yyyy_MM_dd}.log">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%c %M %L]-[%p] %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<DefaultRolloverStrategy max="7"/>
</RollingFile>
<RollingFile name="TEST_ERROR" fileName="${sys:TEST_LOG_ROOT}/TEST_error.log" filePattern="${sys:TEST_LOG_ROOT}/TEST_error_%d{yyyy_MM_dd}.log">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%c %M %L]-[%p] %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

<DefaultRolloverStrategy max="7"/>

</RollingFile>

</Appenders>
<Loggers>
<!-- 过滤包 -->
<Logger name="com.zwz" level="INFO"
additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="TEST_INFO"/>
<AppenderRef ref="TEST_ERROR"/>
<AppenderRef ref="TEST_WARN"/>
</Logger>
<!-- <Root level="INFO" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="TEST_INFO"/>
<AppenderRef ref="TEST_ERROR"/>
<AppenderRef ref="TEST_WARN"/>
</Root> -->
</Loggers>
</Configuration>

注意:

1、按天分日志文件

关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精确到哪一位,interval也精确到哪一个单位。我上面时间精确到天,下面就是一天一个文件。

如果精确的分钟或者小时,就是按分钟或者小时一个文件。

2、日志分类别输出到文件中

在生产环境我们可能需要将日志的error,info,debug按照类别分别放在一个文件中,主要配置在Filters标签中。这是一个info中的配置,我们知道log4j的日志默认等级是trace<debug<info<warn<error<fatal,我们想在info中只输出info日志,我们需要这样配置:

<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
其中onMatech、onMismatch有三个值 ACCEPT/DENY/NEUTRAL根据字面意思我们就能知道了。所以按照顺序过滤掉error、warn类型的log就可以了。

3、过滤包日志

我们有时候想,我的程序我只想记录我自己的日志,不想记得第三方jar中的日志,怎么办了?这里也有办法是解决上面的例子结尾的地方有个Loggers标签下有Logger,这个里面有个属性是name它就是用来过滤包的,只要写上我们自己的包就可以了,比如"com.zwz",这样就只会记录包com.zwz开始的类的log。