Log4j2日志配置打印

Log4j2日志配置打印

LogManager.getLogger是Log4j2提供的一個(gè)用于獲取Logger對(duì)象的方法。它接受一個(gè)字符串參數(shù),用于指定Logger的名稱或者Logger的類。

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

public class MyClass {
    private static final Logger logger = LogManager.getLogger(MyClass.class);

    public void myMethod() {
        logger.info("This is a log message");
    }
}

在上面的示例中,我們使用LogManager.getLogger方法創(chuàng)建了一個(gè)Logger對(duì)象,并將其賦值給一個(gè)靜態(tài)的logger變量。MyClass類中的myMethod方法使用這個(gè)Logger對(duì)象打印了一個(gè)info級(jí)別的日志消息。

為了使用Log4j2,你還需要在項(xiàng)目中添加相關(guān)的依賴項(xiàng)。可以在Maven配置文件(pom.xml)中添加以下依賴項(xiàng):

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.x.x</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.x.x</version>
</dependency>

請(qǐng)將2.x.x替換為所需的Log4j2版本號(hào)。

案例

下面是一個(gè)完整的Log4j2的配置文件示例,將Web層的日志輸出到文件中:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="FileAppender" fileName="logs/mylog.log" append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender" />
        </Root>
        <Logger name="com.example.web" level="trace" additivity="false">
            <AppenderRef ref="FileAppender" />
        </Logger>
    </Loggers>
</Configuration>

請(qǐng)確保將文件名logs/mylog.log更改為您要寫入日志的實(shí)際路徑。

確保將com.example.web替換為您的Web層的包名。

在您的Java代碼中,確保加載該配置文件。例如,在Java應(yīng)用程序的啟動(dòng)代碼中,添加以下代碼:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;

public class MyApp {
    private static final Logger logger = LogManager.getLogger(MyApp.class);

    public static void main(String[] args) {
        // 加載Log4j2配置文件
        Configurator.initialize(null, "path/to/log4j2.xml");

        // 示例日志輸出
        logger.debug("Debug message");
        logger.info("Info message");
        logger.error("Error message");
    }
}

確保將"path/to/log4j2.xml"更改為您的Log4j2配置文件的實(shí)際路徑。

這樣配置后,Web層的日志將會(huì)打印到控制臺(tái)和寫入到指定的日志文件中。

請(qǐng)記得修改配置文件和代碼中的路徑和包名,以適應(yīng)您的具體項(xiàng)目配置。

語法介紹

Log4j2的XML配置文件使用一種特定的語法來定義日志記錄器的配置。以下是Log4j2 XML配置文件的完整語法介紹:

Configuration

<Configuration>元素:配置文件的根元素,用于指定配置的名稱和包名稱。它還有一個(gè)可選的status屬性,用于設(shè)置日志記錄的級(jí)別。

例如:

<Configuration status="INFO" name="MyApp" packages="com.example" monitorInterval="60">

monitorInterval是Log4j2中的配置選項(xiàng),用于指定監(jiān)視配置文件更改的時(shí)間間隔。如果在此時(shí)間間隔內(nèi)檢測(cè)到配置文件的更改,Log4j2會(huì)自動(dòng)重新讀取并重新配置自身,以便應(yīng)用新的配置。

在Log4j2的配置文件中,可以使用以下方式指定monitorInterval

<Configuration monitorInterval="時(shí)間間隔">
    <!-- 配置內(nèi)容 -->
</Configuration>

其中,屬性monitorInterval的含義如下:

  • 時(shí)間間隔:用于指定監(jiān)測(cè)配置文件更改的時(shí)間間隔,默認(rèn)單位為毫秒??梢允褂冒瑔挝坏臅r(shí)間值,如5000ms表示5秒,1m表示1分鐘。

使用monitorInterval配置項(xiàng)可以方便地實(shí)現(xiàn)Log4j2配置文件的動(dòng)態(tài)更新。當(dāng)配置文件更改時(shí),Log4j2會(huì)自動(dòng)重新加載并應(yīng)用新的配置,而無需重啟應(yīng)用程序。這對(duì)于在運(yùn)行時(shí)調(diào)整日志記錄行為非常有用。但是,過于頻繁的重新加載可能會(huì)對(duì)性能產(chǎn)生影響,因此應(yīng)謹(jǐn)慎選擇適當(dāng)?shù)臅r(shí)間間隔設(shè)置。

Properties

<Properties>元素:可選元素,在其中定義一個(gè)或多個(gè)屬性,可以在日志配置的其他部分中重復(fù)使用。每個(gè)屬性通過<Property>元素定義,使用name屬性指定屬性名稱,使用value屬性指定屬性值。例如:

<!-- 自定義一些變量 -->
<Properties>
    <!-- 變量定義 -->
    <Property name="logDir">logs</Property>
    <!-- Appender在將日志數(shù)據(jù)寫入目標(biāo)位置之前,一般會(huì)將日志數(shù)據(jù)通過Layout進(jìn)行格式化。PatternLayout可以使用與C語言printf函數(shù)類似
        的轉(zhuǎn)換模式來指定輸出格式。常見的配置如下:
        - %d{yyyy-MM-dd HH:mm:ss.SSS} : 日志生成時(shí)間,輸出格式為“年-月-日 時(shí):分:秒.毫秒”
        - %p : 日志輸出格式
        - %c : logger的名稱
        - %m : 日志內(nèi)容,即 logger.info("message")
        - %n : 換行符
        - %T : 線程號(hào)
        - %L : 日志輸出所在行數(shù)
        - %M : 日志輸出所在方法名 -->
    <Property name="logPattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] %logger{36} - %msg%n</Property>
    <Property name="LOG_LEVEL">${sys:x.root.logger}</Property>
    <!-- 單個(gè)日志文件最大大小,單位可以是KB, MB or GB -->
        <Property name="max_single_file_size">1MB</Property>
</Properties>

在啟動(dòng)腳本中指定log4j2的配置文件,指定日志級(jí)別,指定日志文件名稱,指定日志目錄。例如下

-Dlog4j.configurationFile=${logfile}
-Dx.root.logger=info
-Dx.log.file=x.log
-Dx.log.dir=/root/log/x

log4j2.xml中的${sys:x.root.logger},相當(dāng)于System.getProperty("x.root.logger");
系統(tǒng)獲取腳本中-D設(shè)置的key對(duì)應(yīng)的值

jvm 啟動(dòng)參數(shù)如下
-Dapp.log.home=D:/logs
———————————————

Appenders

<Appenders>元素:用于定義輸出源(appender),即日志消息將被發(fā)送到的目標(biāo)。每個(gè)輸出源使用<Appender>元素進(jìn)行定義。其中包括輸出源的名稱(name)和輸出目標(biāo)(target)。在輸出源中,可以使用<PatternLayout>元素指定日志消息的格式。ThresholdFilter是Log4j2中的過濾器(Filter),用于過濾日志事件并只保留滿足特定閾值條件的事件。例如:

<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
         <!-- 只接受程序中DEBUG級(jí)別的日志進(jìn)行處理-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
         <!-- 在大多數(shù)情況下,Appender將格式化LogEvent的責(zé)任委托給Layout -->
        <PatternLayout pattern="${logPattern}"/>
    </Console>

    <RollingFile name="File" fileName="${logDir}/myapp.log" filePattern="${logDir}/myapp-%d{MM-dd-yyyy}-%i.log.gz">
        <PatternLayout pattern="${logPattern}"/>
        <!-- Policies and RolloverStrategy -->
    </RollingFile>
</Appenders>

ThresholdFilter的配置如下:

<ThresholdFilter level="閾值級(jí)別" onMatch="匹配操作" onMismatch="不匹配操作"/>

其中,屬性如下:

  • level
    

    :用于指定閾值級(jí)別。只有滿足該級(jí)別的日志事件才會(huì)通過過濾器。

    • 可以使用標(biāo)準(zhǔn)的Log4j2級(jí)別,如tracedebug、infowarn、errorfatal。
  • onMatch
    

    :用于指定匹配操作。當(dāng)日志事件滿足閾值級(jí)別時(shí),執(zhí)行的操作??蛇x值有:

    • ACCEPT:表示接受(保留)該日志事件,并繼續(xù)傳遞給下一個(gè)過濾器/輸出源。
    • DENY:表示拒絕(過濾)該日志事件,不會(huì)繼續(xù)傳遞給下一個(gè)過濾器/輸出源。
  • onMismatch
    

    :用于指定不匹配操作。當(dāng)日志事件不滿足閾值級(jí)別時(shí),執(zhí)行的操作??蛇x值有:

    • ACCEPT:表示接受(保留)該日志事件,并繼續(xù)傳遞給下一個(gè)過濾器/輸出源。
    • DENY:表示拒絕(過濾)該日志事件,不會(huì)繼續(xù)傳遞給下一個(gè)過濾器/輸出源。

RollingFile是Log4j2提供的一個(gè)輸出源(Appender),用于將日志事件寫入到滾動(dòng)文件中。滾動(dòng)文件是指根據(jù)一定的條件(如文件大小或時(shí)間間隔)創(chuàng)建新的日志文件,從而實(shí)現(xiàn)日志文件的分割和管理。

在Log4j2的配置文件中,可以使用RollingFile輸出源來定義輸出到滾動(dòng)文件中的日志事件。示例如下:

<Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/app-%d{yyyyMMdd}.%i.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        <Policies>
            <SizeBasedTriggeringPolicy size="10MB"/>
        </Policies>
        <DefaultRolloverStrategy max="10"/>
    </RollingFile>
</Appenders>

在上述配置中,RollingFile輸出源具有以下屬性:

  • name:用于指定輸出源的名稱。
  • fileName:用于指定日志文件的初始名稱和路徑。
  • filePattern:用于指定滾動(dòng)文件的名稱模式。其中%d{yyyyMMdd}表示當(dāng)前日期,%i表示滾動(dòng)文件的索引。
  • PatternLayout:用于指定日志事件的輸出格式。
  • Policies:用于指定觸發(fā)滾動(dòng)的策略。例如,SizeBasedTriggeringPolicy表示按文件大小觸發(fā)滾動(dòng),當(dāng)日志文件達(dá)到指定大小時(shí)將創(chuàng)建一個(gè)新文件。
  • DefaultRolloverStrategy:用于指定滾動(dòng)策略的默認(rèn)配置。例如,max屬性指定了滾動(dòng)文件的最大數(shù)量,當(dāng)滾動(dòng)文件達(dá)到該數(shù)量時(shí),最舊的文件將被刪除。

只需將RollingFile輸出源添加到適當(dāng)?shù)娜罩居涗浧髦校纯蓪⑷罩臼录懭霛L動(dòng)文件中。例如:

<Loggers>
    <Root level="info">
        <AppenderRef ref="RollingFile"/>
    </Root>
</Loggers>

上述配置將將根日志記錄器的日志事件輸出到RollingFile輸出源中。

使用RollingFile可以方便地實(shí)現(xiàn)日志文件的分割和管理,從而減小單個(gè)日志文件的大小并更好地組織和存檔日志數(shù)據(jù)。

PatternLayout是Log4j2中用于指定日志事件輸出格式的工具。通過使用不同的模式字符串,可以定義日志事件的輸出格式,包括日期、線程、日志級(jí)別、日志記錄器名稱和日志消息等。

PatternLayout中,可以使用預(yù)定義的轉(zhuǎn)換字符來表示不同的日志事件屬性。以下是一些常用的轉(zhuǎn)換字符:

  • %d:日志事件的日期和時(shí)間,可以指定日期格式,例如%d{yyyy-MM-dd HH:mm:ss}。
  • %t:線程名稱。
  • %p:日志級(jí)別。
  • %c:日志記錄器名稱。
  • %m:日志消息。
  • %n:換行符。

除了預(yù)定義的轉(zhuǎn)換字符外,還可以使用組合模式來創(chuàng)建自定義的輸出格式。例如:

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>

在上述示例中,模式字符串%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n定義了日志事件的輸出格式。其中%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和時(shí)間,[%t]表示線程名稱,%-5level表示日志級(jí)別(占用5個(gè)字符的寬度,并且左對(duì)齊),%logger{36}表示日志記錄器名稱(最多顯示36個(gè)字符),%msg表示日志消息,%n表示換行符。

通過使用適當(dāng)?shù)哪J阶址?,可以根?jù)需求自定義日志事件的輸出格式,以滿足不同的日志需求。

在Log4j2中,Policies用于指定滾動(dòng)文件的觸發(fā)策略。滾動(dòng)文件的前提是達(dá)到了某個(gè)條件(如文件大小或時(shí)間間隔),滿足觸發(fā)條件后將創(chuàng)建一個(gè)新的日志文件。

常用的觸發(fā)策略包括:

  • SizeBasedTriggeringPolicy:根據(jù)日志文件的大小觸發(fā)滾動(dòng)。可以通過size屬性指定觸發(fā)滾動(dòng)的大小閾值,例如size="10MB"表示當(dāng)日志文件大小達(dá)到10MB時(shí)觸發(fā)滾動(dòng)。
  • TimeBasedTriggeringPolicy:根據(jù)一定的時(shí)間間隔觸發(fā)滾動(dòng)??梢酝ㄟ^interval屬性指定時(shí)間間隔,例如interval="1"表示每隔1單位觸發(fā)滾動(dòng)。單位可以是Millis(毫秒)、Seconds(秒)、Minutes(分鐘)、Hours(小時(shí))或Days(天)。
  • OnStartupTriggeringPolicy:在應(yīng)用程序啟動(dòng)時(shí)立即觸發(fā)滾動(dòng),創(chuàng)建一個(gè)新的日志文件。
  • CompositeTriggeringPolicy:組合多個(gè)觸發(fā)策略,只要有一個(gè)策略觸發(fā)了滾動(dòng),就會(huì)創(chuàng)建新的日志文件。

以下是一個(gè)使用SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy的示例:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

在上述示例中,Policies包含了SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy,分別指定了根據(jù)日志文件的大小和時(shí)間間隔觸發(fā)滾動(dòng)。當(dāng)日志文件達(dá)到10MB或每隔1單位時(shí),將創(chuàng)建一個(gè)新的日志文件。

通過使用適當(dāng)?shù)挠|發(fā)策略,可以根據(jù)時(shí)間或文件大小等條件來自動(dòng)觸發(fā)滾動(dòng),實(shí)現(xiàn)日志文件的管理和分割。

DefaultRolloverStrategy是Log4j2中的一個(gè)默認(rèn)滾動(dòng)策略,用于指定滾動(dòng)文件的命名策略和最大保留文件數(shù)。

通過max屬性,可以指定最多保留的滾動(dòng)文件數(shù)量。例如max="10"表示最多保留10個(gè)滾動(dòng)文件。

當(dāng)滾動(dòng)文件達(dá)到最大數(shù)量后,會(huì)根據(jù)命名策略來進(jìn)行文件名的調(diào)整。DefaultRolloverStrategy使用了一個(gè)簡(jiǎn)單的命名策略,根據(jù)filePattern屬性中的時(shí)間格式符和索引來生成新的滾動(dòng)文件名。例如filePattern="logs/app-%d{yyyyMMdd}.%i.log",其中%d{yyyyMMdd}表示按照年月日的格式作為滾動(dòng)文件名的一部分,%i表示索引,用于區(qū)分相同時(shí)間格式的不同滾動(dòng)文件。

當(dāng)最大保留文件數(shù)被實(shí)際文件數(shù)量超過后,較早的文件將被刪除,以便實(shí)現(xiàn)滾動(dòng)文件的管理。

以下是一個(gè)示例:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

在上述示例中,通過DefaultRolloverStrategy指定了最多保留10個(gè)滾動(dòng)文件。當(dāng)滾動(dòng)文件數(shù)量超過10個(gè)時(shí),較早的文件將被刪除。滾動(dòng)文件名根據(jù)filePattern中的時(shí)間格式和索引進(jìn)行命名。

在Log4j2中,“Delete”是一種滾動(dòng)策略,用于指定在滾動(dòng)文件時(shí)刪除一些舊文件。

要使用“Delete”滾動(dòng)策略,您需要將其配置在<RollingFile>元素的<DefaultRolloverStrategy>子元素中,或者將其作為<RolloverStrategy>的子元素。

“Delete”滾動(dòng)策略使用一個(gè)或多個(gè)觸發(fā)條件來刪除舊文件。常用的觸發(fā)條件包括以下幾種:

  • IfFileName:根據(jù)文件名是否匹配特定的規(guī)則來刪除文件。例如,可以使用正則表達(dá)式來匹配文件名,并刪除匹配的文件。
  • IfLastModified:根據(jù)文件的最后修改時(shí)間是否在特定的時(shí)間范圍內(nèi)來刪除文件。例如,可以刪除最后修改時(shí)間早于7天前的文件。
  • IfAccumulatedFileCount:根據(jù)文件的累積數(shù)量來刪除文件。例如,可以指定要保留的文件數(shù)量,超過這個(gè)數(shù)量的文件將被刪除。
  • IfAccumulatedFileSize:在遍歷文件樹時(shí)文件總大小超過上限后接受路徑;
  • IfAll:如果所有內(nèi)嵌條件都接受了某個(gè)路徑才會(huì)接受該路徑,相當(dāng)于AND邏輯,其內(nèi)嵌條件的執(zhí)行順序是任意的;
  • IfAny:如果任意一個(gè)內(nèi)嵌條件接受了某個(gè)目錄就接受該目錄,相當(dāng)于OR邏輯,其內(nèi)嵌條件的執(zhí)行順序是任意的
  • IfAny:如果任意一個(gè)內(nèi)嵌條件接受了某個(gè)目錄就接受該目錄,相當(dāng)于OR邏輯,其內(nèi)嵌條件的執(zhí)行順序是任意的

以下是一個(gè)示例,展示了如何使用“Delete”滾動(dòng)策略:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
    </Policies>
    <DefaultRolloverStrategy max="10">
        <Delete basePath="logs">
            <IfFileName glob="logs/app-*-10.log"/>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

在上述示例中,我們?cè)O(shè)置了最大保留文件數(shù)為10,使用SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy觸發(fā)滾動(dòng)。同時(shí),使用了“Delete”滾動(dòng)策略來刪除一些舊的日志文件。在<Delete>元素中,我們指定了要?jiǎng)h除的文件的基本路徑(basePath),然后使用<IfFileName>來匹配文件名模式,并刪除匹配的文件。

通過使用“Delete”滾動(dòng)策略,可以根據(jù)特定的條件自動(dòng)刪除舊的滾動(dòng)文件,實(shí)現(xiàn)日志文件的管理和清理。

IfFileName是Log4j2中“Delete”滾動(dòng)策略中的一種觸發(fā)條件,用于根據(jù)文件名是否匹配特定的規(guī)則來刪除文件。

具體地說,IfFileName使用一個(gè)或多個(gè)glob模式(類似于Unix的文件名模式)來匹配文件名,并刪除匹配的文件??梢允褂靡韵峦ㄅ浞麃碇付J剑?/p>

  • *:匹配任意數(shù)量的字符。
  • ?:匹配單個(gè)字符。
  • [set]:匹配集合中的任意一個(gè)字符。
  • [!set]:匹配不在集合中的任意一個(gè)字符。

以下是一個(gè)示例,展示了如何在“Delete”滾動(dòng)策略中使用IfFileName來刪除匹配特定文件名模式的文件:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
    </Policies>
    <DefaultRolloverStrategy max="10">
        <Delete basePath="logs">
            <IfFileName glob="logs/app-*-10.log"/>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

在上述示例中,我們使用glob="logs/app-*-10.log"來指定要?jiǎng)h除的文件名模式。該模式將匹配以"logs/app-"開頭、以"-10.log"結(jié)尾的文件名,并刪除這些文件。

通過使用IfFileName觸發(fā)條件,可以根據(jù)文件名的模式來刪除匹配的文件,實(shí)現(xiàn)更精細(xì)的日志文件管理。

IfLastModified是Log4j2中“Delete”滾動(dòng)策略中的一種觸發(fā)條件,用于根據(jù)文件的最后修改時(shí)間是否在特定的時(shí)間范圍內(nèi)來刪除文件。

具體地說,IfLastModified使用最后修改時(shí)間(以毫秒為單位)和指定的時(shí)間范圍進(jìn)行比較,并決定是否刪除文件??梢允褂靡韵聴l件之一來指定時(shí)間范圍:

  • age:指定文件的最大年齡(以毫秒為單位)。例如,age="604800000"表示刪除最后修改時(shí)間早于7天前的文件。

  • modtime
    

    :指定文件的最后修改時(shí)間??梢允褂靡韵赂袷街粊碇付〞r(shí)間:

    • yyyy-MM-dd HH:mm:ss(例如,modtime="2021-10-01 12:00:00"
    • yyyy-MM-dd HH:mm:ss.SSS(例如,modtime="2021-10-01 12:00:00.000"
    • yyyy-MM-dd(例如,modtime="2021-10-01"

以下是一個(gè)示例,展示了如何在“Delete”滾動(dòng)策略中使用IfLastModified來刪除最后修改時(shí)間在特定時(shí)間范圍內(nèi)的文件:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
    </Policies>
    <DefaultRolloverStrategy max="10">
        <Delete basePath="logs">
            <IfLastModified age="604800000"/>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

在上述示例中,我們使用age="604800000"來指定最大年齡為7天(以毫秒為單位)。這意味著將刪除最后修改時(shí)間早于7天前的文件。

通過使用IfLastModified觸發(fā)條件,可以根據(jù)文件的最后修改時(shí)間來刪除符合特定時(shí)間范圍的文件,實(shí)現(xiàn)更精細(xì)的日志文件管理。

IfAccumulatedFileCount不是Log4j2中的內(nèi)置觸發(fā)條件。這是因?yàn)樵贚og4j2的滾動(dòng)策略中,并沒有直接基于累積的文件數(shù)量來觸發(fā)滾動(dòng)或刪除文件的內(nèi)置條件。

然而,您可以使用自定義的插件或腳本來實(shí)現(xiàn)基于累積文件數(shù)量的滾動(dòng)和刪除邏輯。

要實(shí)現(xiàn)基于累積文件數(shù)量的滾動(dòng)和刪除策略,您可以考慮以下步驟:

  1. 創(chuàng)建一個(gè)自定義的TriggeringPolicy,用于計(jì)算和跟蹤已累積的文件數(shù)量。
  2. 在每次寫入日志時(shí),更新并計(jì)算已累積的文件數(shù)量。
  3. 當(dāng)已累積的文件數(shù)量達(dá)到特定閾值時(shí),觸發(fā)滾動(dòng)操作,生成新的日志文件。
  4. 在滾動(dòng)操作中,可以根據(jù)需要?jiǎng)h除舊的日志文件,以控制累積文件數(shù)量。

以下是一個(gè)示例偽代碼,展示了如何使用自定義插件實(shí)現(xiàn)基于累積文件數(shù)量的滾動(dòng)和刪除策略:

public class AccumulatedFileCountTriggeringPolicy implements TriggeringPolicy {
    private int maxFileCount;
    private int accumulatedFileCount;

    public AccumulatedFileCountTriggeringPolicy(int maxFileCount) {
        this.maxFileCount = maxFileCount;
        this.accumulatedFileCount = 0;
    }

    @Override
    public boolean isTriggeringEvent(LogEvent event, Path file, long fileLength) {
        updateAccumulatedFileCount();
        return shouldTriggerRollover();
    }

    private void updateAccumulatedFileCount() {
        // 更新已累積的文件數(shù)量
        accumulatedFileCount++;
    }

    private boolean shouldTriggerRollover() {
        // 檢查已累積的文件數(shù)量是否達(dá)到閾值
        return accumulatedFileCount >= maxFileCount;
    }
}

然后,您可以在Log4j2的配置文件中使用這個(gè)自定義的插件:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
        <AccumulatedFileCountTriggeringPolicy maxFileCount="10"/>
    </Policies>
    <DefaultRolloverStrategy max="10">
        <Delete basePath="logs">
            <IfAccumulatedFileCount count="10"/>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

在上述示例中,我們創(chuàng)建了一個(gè)自定義的AccumulatedFileCountTriggeringPolicy,該策略在每次寫入日志時(shí)更新并計(jì)算已累積的文件數(shù)量。當(dāng)已累積的文件數(shù)量達(dá)到10時(shí),使用SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy觸發(fā)滾動(dòng)操作生成新的日志文件。對(duì)于舊的日志文件的刪除,可以使用IfAccumulatedFileCount觸發(fā)條件和Delete策略來控制累積文件數(shù)量不超過10個(gè)。

請(qǐng)注意,上述示例中AccumulatedFileCountTriggeringPolicyIfAccumulatedFileCount是偽代碼,您需要根據(jù)實(shí)際需求進(jìn)行適當(dāng)?shù)膶?shí)現(xiàn)。這只是一種基于累積文件數(shù)量的實(shí)現(xiàn)思路,具體的實(shí)現(xiàn)細(xì)節(jié)可能因您的應(yīng)用場(chǎng)景而異。

IfAccumulatedFileSize也不是Log4j2中的內(nèi)置觸發(fā)條件。在Log4j2的滾動(dòng)策略中,也沒有直接基于累積文件大小來觸發(fā)滾動(dòng)或刪除文件的內(nèi)置條件。

與上述基于累積文件數(shù)量的實(shí)現(xiàn)類似,您可以使用類似的自定義插件或腳本來實(shí)現(xiàn)基于累積文件大小的滾動(dòng)和刪除邏輯。

要實(shí)現(xiàn)基于累積文件大小的滾動(dòng)和刪除策略,您可以考慮以下步驟:

  1. 創(chuàng)建一個(gè)自定義的TriggeringPolicy,用于計(jì)算和跟蹤已累積的文件大小。
  2. 在每次寫入日志時(shí),更新并計(jì)算已累積的文件大小。
  3. 當(dāng)已累積的文件大小達(dá)到特定閾值時(shí),觸發(fā)滾動(dòng)操作,生成新的日志文件。
  4. 在滾動(dòng)操作中,可以根據(jù)需要?jiǎng)h除舊的日志文件,以控制累積文件大小。

以下是一個(gè)示例偽代碼,展示了如何使用自定義插件實(shí)現(xiàn)基于累積文件大小的滾動(dòng)和刪除策略:

public class AccumulatedFileSizeTriggeringPolicy implements TriggeringPolicy {
    private long maxFileSize;
    private long accumulatedFileSize;

    public AccumulatedFileSizeTriggeringPolicy(long maxFileSize) {
        this.maxFileSize = maxFileSize;
        this.accumulatedFileSize = 0;
    }

    @Override
    public boolean isTriggeringEvent(LogEvent event, Path file, long fileLength) {
        updateAccumulatedFileSize(fileLength);
        return shouldTriggerRollover();
    }

    private void updateAccumulatedFileSize(long fileLength) {
        // 更新已累積的文件大小
        accumulatedFileSize += fileLength;
    }

    private boolean shouldTriggerRollover() {
        // 檢查已累積的文件大小是否達(dá)到閾值
        return accumulatedFileSize >= maxFileSize;
    }
}

然后,您可以在Log4j2的配置文件中使用這個(gè)自定義的插件:

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1"/>
        <AccumulatedFileSizeTriggeringPolicy maxFileSize="100MB"/>
    </Policies>
    <DefaultRolloverStrategy max="10">
        <Delete basePath="logs">
            <IfAccumulatedFileSize size="100MB"/>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

在上述示例中,我們創(chuàng)建了一個(gè)自定義的AccumulatedFileSizeTriggeringPolicy,該策略在每次寫入日志時(shí)更新并計(jì)算已累積的文件大小。當(dāng)已累積的文件大小達(dá)到100MB時(shí),使用SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy觸發(fā)滾動(dòng)操作生成新的日志文件。對(duì)于舊的日志文件的刪除,可以使用IfAccumulatedFileSize觸發(fā)條件和Delete策略來控制累積文件大小不超過100MB。

請(qǐng)注意,上述示例中AccumulatedFileSizeTriggeringPolicyIfAccumulatedFileSize是偽代碼,您需要根據(jù)實(shí)際需求進(jìn)行適當(dāng)?shù)膶?shí)現(xiàn)。這只是一種基于累積文件大小的實(shí)現(xiàn)思路,具體的實(shí)現(xiàn)細(xì)節(jié)可能因您的應(yīng)用場(chǎng)景而異。

Loggers

<Loggers>元素:用于定義日志記錄器(logger),即日志消息被發(fā)送到的特定目錄。有兩種類型的日志記錄器:<Root>日志記錄器和普通日志記錄器(通過其名稱進(jìn)行識(shí)別)。每個(gè)日志記錄器使用<Logger>元素進(jìn)行定義。在日志記錄器中,可以通過level屬性指定日志的級(jí)別,并使用<AppenderRef>元素指定日志消息的輸出源。例如:

<Loggers>
    <Root level="info">
        <AppenderRef ref="Console"/>
        <AppenderRef ref="File"/>
        <AppenderRef ref="DruidSqlRollingFile"/>
    </Root>

    
    <Logger name="com.example.MyClass" level="debug">
        <AppenderRef ref="File"/>
    </Logger>
     <!--記錄druid-sql的記錄-->
        <Logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="DruidSqlRollingFile"/>
        </Logger>
 
        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <Logger name="org.springframework" level="INFO"/>
</Loggers>

以上是Log4j2 XML配置文件的完整語法介紹。通過使用這些元素和屬性,可以對(duì)日志記錄器的行為進(jìn)行詳細(xì)的配置和定制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容