log4j配置文件详解
【参考文章】: Log4j2中RollingFile的文件滚动更新机制
1. 配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!-- ALL < TRACE< DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<!-- status: log4j本身的日志信息级别 -->
<Configuration status="OFF">
<!-- 配置变量,可以在下面通过变量名进行引用 -->
<Properties>
<Property name="BaseDir">logs</Property>
<Property name="LogName">info</Property>
<Property name="LogExtensionName">gz</Property>
</Properties>
<Appenders>
<!-- 日志写入文件 -->
<RollingFile
name="RollingFile"
fileName="${BaseDir}/${LogName}.${LogExtensionName}"
filePattern="${BaseDir}/$${date:yyyy-MM}/logs-%d{yyyy-MM-dd-HH}-%i.${LogExtensionName}.gz"
>
<!-- 日志信息格式 -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%t] [%p] %c{1}.%M [%L] %m%n"/>
<!-- 判断哪些级别的日志可以写入该文件 -->
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 触发策略,决定何时触发文件的压缩, 满足下面任意一个条件都会触发压缩 -->
<Policies>
<!-- filePattern 中的最小粒度为单位, 每隔 interval 个单位时间压缩一次 -->
<!-- 比如: yyyy-MM-dd-HH, 则每隔5个小时压缩一次 -->
<TimeBasedTriggeringPolicy interval="5"/>
<!-- 文件大小超过500MB时压缩日志文件 -->
<SizeBasedTriggeringPolicy size="500MB"/>
</Policies>
<!--
max参数是与filePattern中的计数器%i配合使用,根据filePattern的不同max的含义也不同
1. 如果filePattern没有%i,则max不会生效
2. 如果filePattern没有时间格式,有%i, 文件个数达到max, 则会删除旧的日志文件
3. 如果filePattern有时间格式,有%i, 则时间格式相同时,文件个数达到max,则会删除旧的日志文件
例如 %d{yyyy-MM-dd-HH}, 如果某个小时的文件个数大于max,则会删除这个小时内的旧的日志文件
-->
<DefaultRolloverStrategy max="7">
<!-- 删除策略 -->
<!-- maxDepth=2: 表示该策略会应用于BaseDir子目录下的日志文件 -->
<Delete basePath="${BaseDir}" maxDepth="2">
<!-- 下面的文件名策略,文件最新的修改时间策略,文件大小策略,文件个数策略都可以进行组合使用 -->
<!-- IfAny 表示或, IfAll 表示与 -->
<!-- 如果filePattern中包含时间格式,则IfFileName策略会按照时间格式维度进行判断 -->
<!--
例如时间格式为%d{yyyy-MM-dd-HH},以2022-10-01-12的文件为例
info-2022-10-10-12-1.log.gz
info-2022-10-10-12-2.log.gz
info-2022-10-10-12-3.log.gz
info-2022-10-10-12-4.log.gz
1. 将2022-10-01-12的所有文件进行一次逻辑判断
2. 如果文件都超过30天未修改
3. 满足下面两个任意一个条件即可删除
3.1 2022-10-01-12文件总大小大于5GB
3.2 2022-10-01-12文件总个数大于3个
-->
<IfFileName glob="*/${LogName}-*.${LogExtensionName}.gz">
<IfLastModified age="30d">
<IfAny>
<IfAccumulatedFileSize exceeds="5GB"/>
<IfAccumulatedFileCount exceeds="3"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
<!-- maxDepth=1: 表示该策略会应用于BaseDir目录下的日志文件 -->
<Delete basePath="${BaseDir}" maxDepth="1">
<IfLastModified age="10d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- 输出到控制台的日志信息 -->
<Console name="console" target="SYSTEM_OUT">
<ThresholdFilter level="INFO"/>
<PatternLayout pattern="[%d{yyyy-MM-dd-HH:mm:ss}] [%-15t] [%-5p] - %-35C{1} %M - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
2. 注意事项
1. PatternLayout
1. 模式字符含义
%d: 日志产生时间
%t: thread id当前线程ID
%p: priority日志优先级(DEBUG、INFO、WARN……)
%F: 日志所在文件名
%c: logger的名称
%C: 日志请求的完全限定类名(例如类名为com.skd.demo.App, %C{1} 会输出App)
%M: 日志所在方法名
%L: 日志语句所在的行号
%m: 日志内容
%n: 换行符
2. 格式修饰符
以%M为例:
%20M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐
%-20M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐
%.20M: 左对齐,如果方法名长度大于20个字符,则保留右边的20个字符
%20.30M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐; 如果长度大于30,则保留右边的30个字符
%-20.30M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐; 如果长度大于30,则保留左边的30个字符
2. ThresholdFilter
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
如果文章对您有所帮助,可以点一下推荐