簡體   English   中英

默認 log4j 策略

[英]Default log4j policy

我試圖了解TimeBasedTriggeringPolicy如何確定何時創建/附加/刪除日志文件。

對於以下配置:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>

這個對嗎:

%d參數表示每天都會創建一個附加當前{yyyy-MM-dd}的新日志文件 test.log? 以前版本的test.log 沒有被刪除? 如果我將 %d 更改為 %M 是否應該每月創建一個新文件?

為了確保只有當天的日志文件可用並刪除其他日志文件,應將策略修改為:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>

?

我試圖了解 TimeBasedTriggeringPolicy 如何確定何時創建/附加/刪除日志文件。

TimeBasedTriggeringPolicy控制下一次翻轉發生的時間。 下一次翻轉時間根據提供的日期單位確定。 {yyyy-MM-dd}表示第二天。 在沒有其他觸發策略的情況下,所有日志都將附加到當天文件。

DefaultRolloverStrategy控制何時根據文件模式歸檔/刪除/創建日志文件。 第二天到來時,將創建具有當前日期的新文件,並將所有日志附加到新文件中。 根據翻轉策略配置,可以保留或刪除前一天的文件。 maxmin屬性控制文件模式中帶有%i說明符的文件數,以維護文件計數器和fileIndex以控制文件重命名。

原來的

%d 參數表示每天都會創建一個附加當前 {yyyy-MM-dd} 的新日志文件 test.log? 以前版本的test.log 沒有被刪除? 如果我將 %d 更改為 %M 是否應該每月創建一個新文件?

%d是轉換說明符 - Log4j 2 具有用於不同轉換說明符的轉換器。 %d引用日期並允許您發送日期格式。 日期時間單元本身控制何時發生翻轉。 %m在 log4j2 中無法識別,您可以使用%d{yyyy-MM}每月創建文件。 您可以使用modulate標志在間隔邊界處翻轉文件 - 月初。

為了確保只有當天的日志文件可用並刪除其他日志文件,應將策略修改為:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}" TimeBasedTriggeringPolicy interval="1"/> /RollingRandomAccessFile>?

是的,這是正確的。 interval="1"是默認值,因此可以刪除。 當您未指定任何翻轉策略時,將應用DefaultRollOverStrategy 默認翻轉策略將使用提供的文件名模式進行翻轉。 由於這是每天( -dd ),它將每天滾動文件,同一天沒有中間文件。

文檔-

RollingRandomAccessFileAppender 需要 TriggeringPolicy 和 RolloverStrategy。 觸發策略確定是否應執行翻轉,而 RolloverStrategy 定義應如何完成翻轉。 如果沒有配置 RolloverStrategy,RollingRandomAccessFileAppender 將使用 DefaultRolloverStrategy

您可以使用適當的觸發策略和翻轉策略進一步自定義。

其中,當您配置RollingFileAppender時,您需要為filePattern參數提供一個值。

此配置參數將指示生成的歸檔日志文件的文件名模式。

此模式的格式取決於RollingFileAppender使用的RolloverPolicy

默認情況下,Log4j 2 將使用Default Rollover Strategy

此策略將允許您基於數字索引、通過指示%i模式標記或按日期/時間、通過在您的用例中指示%d模式標記來翻轉日志。 您也可以將數字索引添加到日期/時間模式:在這種情況下,數字索引將遞增,直到日期/時間模式的結果發生變化。

如果您定義日期/時間模式,則需要通過傳遞SimpleDateFormat兼容模式(在您的示例中yyyy-MM-dd )來提供執行翻轉的基本粒度。

我說的是基本粒度,而不僅僅是粒度,因為實際的日志翻轉時刻將取決於您如何配置與RollingFileAppender關聯的觸發策略。

TimeBasedTriggeringPolicy的情況下,您可以配置幾個參數來確定日志翻轉行為,主要是兩個。

首先,您有interval參數:它將根據日期模式中最具體的時間單位指示翻轉應該發生的頻率。 即,如果像您的示例一樣,您將天配置為最具體的單位並為interval參數提供值3 (默認為1 ),則翻轉將每3天發生一次。

其次,您可以激活(默認為falsemodulate參數。 此參數指示是否應調整間隔以使下一次翻轉發生在間隔邊界上。 Log4j2 文檔提供了一個清晰的示例:

例如,如果項目是小時,當前時間是凌晨 3 點,間隔是 4,那么第一次翻轉將發生在凌晨 4 點,然后下一個翻轉將發生在早上 8 點、中午、下午 4 點等。

在您的用例中會發生類似的事情,但語義是一年中的一天。

有關詳細信息,請參閱PatternProcessor class 的源代碼 還要注意increment方法

關於日志刪除,據我所知,如果您在模式中使用數字索引(通過調整fileIndexmin end max參數),默認翻轉策略只會刪除舊文件,但是,由於 Log4j 2.5,您可以使用delete發生日志翻轉時執行清理基於日期/時間的日志的操作(在 Log4j 中,將操作視為一種鈎子)。

例如,如果您只需要將日志文件保留30天,您可以使用以下內容配置此功能:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}">
  <Policies>
    <TimeBasedTriggeringPolicy/>
  </Policies>
  <DefaultRolloverStrategy>
    <Delete basePath="/logs">
      <IfFileName glob="test.log.*" />
      <IfLastModified age="30d" />
    </Delete>
  </DefaultRolloverStrategy>
</RollingRandomAccessFile>

請務必注意,刪除過程可能會影響任何文件,而不僅僅是日志文件:請務必參數化執行刪除過程的正確路徑,並在使用此功能時提供正確的glob模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM