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/xlog4j2.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í)別,如
trace、debug、info、warn、error、fatal。
- 可以使用標(biāo)準(zhǔn)的Log4j2級(jí)別,如
-
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è)使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy的示例:
<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包含了SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy,分別指定了根據(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,使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy觸發(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)和刪除策略,您可以考慮以下步驟:
- 創(chuàng)建一個(gè)自定義的
TriggeringPolicy,用于計(jì)算和跟蹤已累積的文件數(shù)量。 - 在每次寫入日志時(shí),更新并計(jì)算已累積的文件數(shù)量。
- 當(dāng)已累積的文件數(shù)量達(dá)到特定閾值時(shí),觸發(fā)滾動(dòng)操作,生成新的日志文件。
- 在滾動(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í),使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy觸發(fā)滾動(dòng)操作生成新的日志文件。對(duì)于舊的日志文件的刪除,可以使用IfAccumulatedFileCount觸發(fā)條件和Delete策略來控制累積文件數(shù)量不超過10個(gè)。
請(qǐng)注意,上述示例中AccumulatedFileCountTriggeringPolicy和IfAccumulatedFileCount是偽代碼,您需要根據(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)和刪除策略,您可以考慮以下步驟:
- 創(chuàng)建一個(gè)自定義的
TriggeringPolicy,用于計(jì)算和跟蹤已累積的文件大小。 - 在每次寫入日志時(shí),更新并計(jì)算已累積的文件大小。
- 當(dāng)已累積的文件大小達(dá)到特定閾值時(shí),觸發(fā)滾動(dòng)操作,生成新的日志文件。
- 在滾動(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í),使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy觸發(fā)滾動(dòng)操作生成新的日志文件。對(duì)于舊的日志文件的刪除,可以使用IfAccumulatedFileSize觸發(fā)條件和Delete策略來控制累積文件大小不超過100MB。
請(qǐng)注意,上述示例中AccumulatedFileSizeTriggeringPolicy和IfAccumulatedFileSize是偽代碼,您需要根據(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ì)的配置和定制。