Hello World

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" 表示不匹配该级别以下的
posted @ 2022-10-17 17:52  小小忧愁米粒大  阅读(1197)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书