Log4j2配置文件总结

整理一下最近项目中用到的Log4j2配置文件。产品上线后,只能通过机器的运行参数以及运行日志能够及时、准确地了解产品的运行状况。日志的作用至关重要,关键节点、错误堆栈等信息能帮助我们快速的定位并解决问题。干净利索的日志文件使我们身心愉悦#89。本文记录一下学习log4j2配置中的一些心得体会,有问题期待大佬们指点。

1.配置结构

本文事例中configuration下有三个节点

  • properties:配置文件中用到的参数设定
  • appenders:定义了日志的输出源
  • loggers:定义了日志的输入源

2.参数说明

这里只介绍几个在实际应用中有意义的参数.

1))fileName与filePattern:fileName是日志生成后所在的文件名,filePattern是滚动机制发动后fileName归档后的文件名。如果fileName为空,fileName会被设置成filePattern。

2)filePattern:filePattern="logs/%d{yyyy-MM-dd}/game.%d{yyyy-MM-dd-HH}.%i.log",其中红色部分%d{yyyy-MM-dd},实现的效果是每天的日志会归档到同一天。

3)filePattern:filePattern="logs/%d{yyyy-MM-dd}/game.%d{yyyy-MM-dd-HH}.%i.log",其中红色部分%i实现的效果是当程序在归档时,文件名序号会自动递增,最大值后面介绍。

4)ThresholdFilter:日志级别过滤器,过滤的结果值是个枚举类型。

enum Result {
    /**
     * 当前的日志会被输出,不需要再经过其他过滤器筛选
     */
    ACCEPT,
    /**
     * 当前过滤器不做判定,需要其他过滤器筛选,没有后续过滤器的话该日志被过滤掉
     */
    NEUTRAL,
    /**
     * 当前的日志会被过滤掉
     */
    DENY;
}

 5)TimeBasedTriggeringPolicy中设定的interval的单位是filePattern进行处理后获取的,具体来说就是filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log"中包含了"H",会被转化成{RolloverFrequency.HOURLY}.

6)DefaultRolloverStrategy中max参数的设定:max参数是配合filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log"中的%i进行使用的。这里的max设定了除%i外相同的文件数,默认为7。

7)Delete表示的是在{basePath}文件夹中递归深度{maxDepth}下删除指定条件的归档日志。Delete支持的策略包括一下几种。

  1. IfAccumulatedFileCount:所有文件数超过{threshold}会被删除
  2. IfAccumulatedFileSize:所有文件大小超过{threshold}会被删除
  3. IfFileName:文件名符合正则表达式的删除
  4. IfLastModified:上次更新时间超过一定时限时删除
  5. IfAll、IfAny、IfNot来表示以上几种条件的组合策略
  6. 查看代码发现以上策略在log4j-core的Log4j2Plugins.dat已经注册过,所以能直接使用。能不能自己实现一些策略注入,有大佬清楚的话请指点一下。

3.附件

自己整理的一份配置文件模板,希望对大家有所帮助。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
    <!--properties-->
    <properties>
        <!-- 运行日志位置-->
        <property name="LOG_HOME">logs</property>
        <!-- info日志滚动仓库-->
        <property name="LOG_REPO">logs/%d{yyyy-MM-dd}</property>
        <!-- 错误日志滚动仓库-->
        <property name="WARN_REPO">logs/error</property>
        <!--日志格式-->
        <property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property>
        <!--文件过期时间-->
        <property name="LOG_EXPIRE">15d</property>
        <!--单文件大小-->
        <property name="LOG_SIZE">100MB</property>
    </properties>
    <!--appenders -->
    <appenders>
        <!--控制台输出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式 -->
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <!--打印出所有的info信息,每小时滚动一次,单文件最大100M,文件最多保留15天 -->
        <RollingFile name="InfoFile" fileName="${LOG_HOME}/game.log"
                     filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--每小时滚动一次,单文件最大100M-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="10">
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!--打印出所有的warn/error信息,单文件最大100M后滚动,文件最多保留15天 -->
        <RollingFile name="WarnFile" fileName="${LOG_HOME}/game.warn.log"
                     filePattern="${WARN_REPO}/game.%d{yyyy-MM-dd}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--单文件最大100M-->
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--运行日志-->
        <logger name="com.msgame" additivity="false">
            <level value="INFO"/>
            <appenderRef ref="InfoFile"/>
            <appenderRef ref="WarnFile"/>
            <appenderRef ref="Console"/>
        </logger>
        <!--默认日志 -->
        <root level="info">
            <appender-ref ref="InfoFile"/>
        </root>
    </loggers>
</configuration>

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值