log4j2 配置文件样例

提供一个log4j2的配置文件样例,样例会把日志按照级别,分别打印在各自的文件中,并且按照每天进行划分,每天最多分割10个文件。另外,还有一个单独的日志,会记录特定的日志。

样例代码如下

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
    static Logger logger = LogManager.getLogger(Main.class);
    static Logger logger2 = LogManager.getLogger("COMBAUSERINFO");
    public static void main(String[] args) throws InterruptedException {
        int i=0;
        while(true){
            Thread.sleep(2);
            logger.debug("DEBUG Message "+i);   //不会打印
            logger.info("INFO Message "+i);     //打印在 INFO.log
            logger.warn("WARN Message "+i);     //打印在 WARN.log
            logger.error("ERROR Message "+i);     //打印在 ERROR.log
            if((i++)%100==0) {
                System.out.println("i="+i);
                // 以下日志全部打印在 USERINFOFILE.log,同时每个等级会打印在对应的INFO.log 或 WARN.log 或 ERROR.log,并在控制台中打印
                logger2.debug("User debug Message "+i);
                logger2.info("User Info Message "+i);
                logger2.warn("User warn Message "+i);
                logger2.error("User error Message "+i);
            }
        }
    }
}

样例的日志效果

INFO.log的内容

WARN.log的内容

USERINFOFILE.log的内容

最后,附上log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logdir">logs</Property>
        <!-- <Property name="logdir">${sys:catalina.base}/logs</Property> -->
    </Properties>
    <Appenders>
        <!-- fileName中不知道怎么带上日期 -->
        <RollingFile name="INFO"
                     fileName="${logdir}/INFO.log"
                     filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log">
            <Filters>
                <!--
                    定义两个过滤器,第一个过滤器过滤掉warn以上级别的日志,然后warn级别以下的日志,继续使用第二个过滤器
                    第二个过滤器接收info以上级别的日志,两个过滤器组合起来就只剩下info日志了
                    onMismatch="NEUTRAL" 表示没匹配到的日志级别,将继续使用下一个过滤器
                -->
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>

            <!--
                定义每个文件最大30M,在每天0点生成新一天的文件
                interval=1,表示周期是1,因为filterPattern中的日期格式最后一位是天,所以这里表示周期是1天
                modulate="true" 表示整点触发,也就是每天的0点
                如果是yyyy-MM-dd-HH-mm ,则表示是在一分钟的0秒触发
            -->
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="30MB" />
            </Policies>

            <!-- 定义每天最多10个分割文件,最多保留30天-->
            <DefaultRolloverStrategy max="10">
                <Delete basePath="${logdir}" maxDepth="1">
                    <IfFileName glob="INFO_*.log" />
                    <IfLastModified age="30d" />
                    <!--
                    <IfLastModified age="24H" /> 保留24小时,这个单位需要和filePattern中的日期保持同一粒度
                    <IfLastModified age="60m" /> 保留 60分钟
                    -->
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="WARN"
                     fileName="${logdir}/WARN.log"
                     filePattern="${logdir}/WARN_%d{yyyy-MM-dd}_%i.log">
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="30MB" />
            </Policies>
            <DefaultRolloverStrategy max="10">
                <Delete basePath="{logdir}/" maxDepth="1">
                    <IfFileName glob="WARN_*.log" />
                    <IfLastModified age="30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="ERROR"
                     fileName="${logdir}/ERROR.log"
                     filePattern="${logdir}/ERROR_%d{yyyy-MM-dd}_%i.log">
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="30M" />
            </Policies>
            <DefaultRolloverStrategy max="10">
                <Delete basePath="{logdir}/" maxDepth="1">
                    <IfFileName glob="ERROR_*.log" />
                    <IfLastModified age="30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="USERINFOFILE"
                     fileName="${logdir}/USERINFOFILE.log"
                     filePattern="${logdir}/USERINFOFILE_%d{yyyy-MM-dd}.log">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="128KB" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="{logdir}/" maxDepth="1">
                    <IfFileName glob="USERINFOFILE_*.log" />
                    <IfLastModified age="30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <Console name="USERINFO" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
        </Console>


    </Appenders>

    <loggers >
        <logger name="COMBAUSERINFO" level="INFO">
            <appender-ref ref="USERINFO" />
            <appender-ref ref="USERINFOFILE" />
        </logger>
        <root level="INFO">
            <appender-ref ref="INFO" />
            <appender-ref ref="WARN" />
            <appender-ref ref="ERROR" />
        </root>
    </loggers>
</Configuration>

上面的INFO日志节点,我把每个文件大小设置成30M了

划分周期也改成天了,如果想要改回分钟,就将

filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log"
改成filePattern="${logdir}/INFO_%d{yyyy-MM-dd-HH-mm}_%i.log"
将<IfLastModified age="30d" />
改成<IfLastModified age="7m" />

最后,提一下log4j2的3个坑,暂时还没找到解决办法

1.首个日志文件无法带上日志,只能是INFO.log,而不能是INFO_yyyy-MM-dd.log

2.日志文件的名称中不能同时使用中括号和序号,比如[yyyy-MM-dd]-%i-INFO.log,会报错

3.日志文件分割的序号无法倒序,也就是INFO_1.log记录的日志,比INFO_2.log的日志早

如果你们知道怎么解决这三个问题,可以回复一下我

发布了22 篇原创文章 · 获赞 2 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章