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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章