1. 程式人生 > >log4j2自動刪除 歷史日誌 配置

log4j2自動刪除 歷史日誌 配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- status : 指定log4j本身的列印日誌的級別.ALL< Trace < DEBUG < INFO < WARN < ERROR
< FATAL < OFF monitorInterval : 用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s. -->
<Configuration status="ALL" monitorInterval="30">
    <Properties>
<!-- 
配置日誌檔案輸出目錄 ${sys:user.home} --> <!--共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF. All:最低等級的,用於開啟所有日誌記錄. Trace:是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出. Debug:指出細粒度資訊事件對除錯應用程式是非常有幫助的
. Info:訊息在粗粒度級別上突出強調應用程式的執行過程. Warn:輸出警告及warn以下級別的日誌. Error:輸出錯誤資訊日誌. Fatal:輸出每個嚴重的錯誤事件將會導致應用程式的退出的日誌. OFF:最高等級的,用於關閉所有日誌記錄--> <Property name="LOG_HOME"><!--/home/liuhua/gongzuokongjian1/idea/TestDataCom/-->logs112</Property>
<property name="ERROR_LOG_FILE_NAME"><!--/home/liuhua/gongzuokongjian1/idea/TestDataCom/logs-->${LOG_HOME}/error</property> <property name="WARN_LOG_FILE_NAME"><!--/home/liuhua/gongzuokongjian1/idea/TestDataCom/logs-->${LOG_HOME}/warn</property> <property name="INFO_LOG_FILE_NAME"><!--/home/liuhua/gongzuokongjian1/idea/TestDataCom/logs-->${LOG_HOME}/info</property> <property name="DEBUG_LOG_FILE_NAME"><!--/home/liuhua/gongzuokongjian1/idea/TestDataCom/logs-->${LOG_HOME}/debug</property> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%M-%L-%t] %-5level %logger{36} - %msg%n </property> <!-- <property name="PATTERN">%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n </property>--> </Properties> <Appenders> <!--這個輸出控制檯的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 輸出日誌的格式 --> <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間 %p : 日誌輸出格式 %c : logger的名稱 %m : 日誌內容,即 logger.info("message") %n : 換行符 %C : Java類名 %L : 日誌輸出所在行數 %M : 日誌輸出所在方法名 hostName : 本地機器名 hostAddress : 本地ip地址 --> <PatternLayout pattern="${PATTERN}"/> </Console> <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 --> <!--appendTRUE表示訊息增加到指定檔案中,false表示訊息覆蓋指定的檔案內容,預設值是true --> <File name="log" fileName="${LOG_HOME}/test.log" append="false"> <PatternLayout pattern="${PATTERN}"/> </File> <!-- 這個會打印出所有的info及以下級別的資訊,每次大小超過size 則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔 --> <RollingFile name="RollingFileDebug" fileName="${DEBUG_LOG_FILE_NAME}/debug.log" filePattern="${DEBUG_LOG_FILE_NAME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log"> <Filters> <!--設定只輸出級別為debug的日誌--> <ThresholdFilter level="debug"/> <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <!-- <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>--> <PatternLayout pattern="${PATTERN}"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="2 kB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 --> <!--<DefaultRolloverStrategy max="20"/>--> <DefaultRolloverStrategy max="100"> <Delete basePath="${DEBUG_LOG_FILE_NAME}" maxDepth="2"> <IfFileName glob="*/debug-*.log"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileSize exceeds="100 GB" /> <IfAccumulatedFileCount exceeds="10" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileInfo" fileName="${INFO_LOG_FILE_NAME}/info.log" filePattern="${INFO_LOG_FILE_NAME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <Filters> <!--設定只輸出級別為info的日誌--> <ThresholdFilter level="info"/> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch--> <!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>--> <PatternLayout pattern="${PATTERN}"/> <Policies> <!-- 基於時間的滾動策略,interval屬性用來指定多久滾動一次,預設是1 hour modulate=true用來調整時間:比如現在是早上3aminterval4,那麼第一次滾動是在4am,接著是8am12am...而不是7am. --> <!-- 關鍵點在於 filePattern後的日期格式,以及TimeBasedTriggeringPolicyinterval 日期格式精確到哪一位,interval也精確到哪一個單位 --> <!-- log4j2的按天分日誌檔案 : info-%d{yyyy-MM-dd}-%i.log--> <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>--> <TimeBasedTriggeringPolicy/> <!-- SizeBasedTriggeringPolicy:Policies子節點, 基於指定檔案大小的滾動策略,size屬性用來定義每個日誌檔案的大小. --> <SizeBasedTriggeringPolicy size="2 kB" /> </Policies> <DefaultRolloverStrategy max="100"> <Delete basePath="${INFO_LOG_FILE_NAME}" maxDepth="2"> <IfFileName glob="*/info-*.log"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileSize exceeds="100 GB" /> <IfAccumulatedFileCount exceeds="10" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log" filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <Filters> <!--設定只輸出級別為WARN的日誌--> <ThresholdFilter level="warn"/> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <!--<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>--> <PatternLayout pattern="${PATTERN}"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="2 kB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 --> <DefaultRolloverStrategy max="100"> <Delete basePath="${WARN_LOG_FILE_NAME}" maxDepth="2"> <IfFileName glob="*/warn-*.log"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileSize exceeds="100 GB" /> <IfAccumulatedFileCount exceeds="10" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log" filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log"> <Filters> <!--設定只輸出級別為error的日誌--> <ThresholdFilter level="error"/> <!--<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>--> </Filters> <!--<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>--> <PatternLayout pattern="${PATTERN}"/> <Policies> <!-- log4j2的按分鐘 分日誌檔案 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- <SizeBasedTriggeringPolicy size="10 MB" /> --> </Policies> <DefaultRolloverStrategy max="100"> <Delete basePath="${ERROR_LOG_FILE_NAME}" maxDepth="2"> <IfFileName glob="*/error-*.log"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileSize exceeds="100 GB" /> <IfAccumulatedFileCount exceeds="10" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- log4j2 分執行緒寫日誌 --> <Routing name="thread"> <!-- log4j2 寫那個執行緒的日誌 寫這個執行緒 ThreadContext.put("userId120231", uuid1); --> <Routes pattern="$${ctx:userId120231}"> <Route> <RollingFile name="RollingFile-${ctx:userId120231}" fileName="${LOG_HOME}/${ctx:userId120231}.log" filePattern="${LOG_HOME}/${ctx:userId120231}-%d{HH-mm-ss}.log" append="false"> <!--%X{userId120231} ThreadContext.put("userId120231", uuid1);中的內容寫出來--> <PatternLayout pattern="%X{userId120231} ${PATTERN}"/> <Policies> <SizeBasedTriggeringPolicy size="100M"/> </Policies> <DefaultRolloverStrategy max="100"/> <Filters> <!--此處可新增過濾,被我刪掉了,可以根據等級過濾--> </Filters> </RollingFile> </Route> <Route ref="STDOUT" key="${ctx:userId120231}"/> </Routes> </Routing> </Appenders> <!--然後定義logger,只有定義了logger並引入的appenderappender才會生效--> <Loggers> <!--過濾掉springmybatis的一些無用的DEBUG資訊--> <!-- <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger>--> <!-- 第三方日誌系統 --> <!-- <logger name="org.springframework.core" level="info"/> <logger name="org.springframework.beans" level="info"/> <logger name="org.springframework.context" level="info"/> <logger name="org.springframework.web" level="info"/> <logger name="org.jboss.netty" level="warn"/> <logger name="org.apache.http" level="warn"/>--> <!-- 配置日誌的根節點 --> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileDebug"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> <appender-ref ref="thread"/> </root> </Loggers> </Configuration>
package test.data.com.main;
import org.apache.logging.log4j.*;
import java.util.*;
/**
 * @param
* @param
* @param
* @author HUAZAI
 * @title:
* @description:
* @return 返回型別 :
 * <ul>
* <li></li>
* <li></li>
* <ul>
* @throws
* @date 18-4-2 上午11:42
 */
public class MainTest {
    private static final org.apache.logging.log4j.Logger logger1 = org.apache.logging.log4j.LogManager.getLogger(MainTest.class);
//    private static final org.apache.log4j.Logger logger1 = org.apache.log4j.Logger.getLogger(MainTest.class);
private static void testLogger(){
        int i = 1;
String uuid1 = UUID.randomUUID().toString();
String uuid2 = UUID.randomUUID().toString();
        while (true) {
            ThreadContext.put("userId120231", uuid1);//log4j2日誌的MDC分執行緒寫日誌

ThreadContext.put("userId132018", uuid2);
logger1.info("log4j2 info");
logger1.info("這是第 " + ((i-1) * 2) + " ");
logger1.debug("log4j2 debug");
logger1.warn("log4j2 warn");
//            logger1.error("log4j2 error");
logger1.trace("log4j2 trace");
logger1.fatal("log4j2 fatal");
i++;
            try {
                Thread.sleep(2000);
} catch (InterruptedException e) {
                e.printStackTrace();
}
        }
//        int i = 0;
//        try {
//            i /= i;
//        } catch (Exception e) {
//            e.printStackTrace();
//            logger1.error("出現異常", e);
//        }
}
    public static void main(String[] args) {
        testLogger();
}
}