簡體   English   中英

Log4j2 Rolling appender - fileName根據模式“滑動”

[英]Log4j2 Rolling appender - fileName “sliding” according to pattern

我正在尋找翻轉策略,其中當前日志( 手動術語中的活動輸出目標 )文件名不是固定的,而是由模式指定,或者更確切地說 - 與filePattern屬性中的模式相同。

我想實現每日翻轉,其中今天的日志就是log-2015-05-05.log並且在午夜框架上停止編寫它並開始寫入log-2015-05-06.log 但是,AFAIK,目前的配置只允許

<RollingFile name="ROLFILE"
    fileName="log.log"
    filePattern="log-%d{yyyy-MM-dd}.log"
>

fileName屬性中指定相同的值不起作用(導致具有字面解釋的敏感字符的文件)。 我注意到沒有帶有動態值fileName示例或SO問題。 請注意, fileName="log-${date:yyyy-MM-dd}.log"無法解決問題,因為僅在啟動時評估表達式,即使事件的時間戳與表達式不匹配,事件仍會發送到文件中。

我正在從Log4j 1.2遷移到Log4j 2.2。 在舊版本中,可以使用所需的行為

<appender name="ROLFILE" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" value="log-%d{yyyy-MM-dd}.log" />
    </rollingPolicy>
    ...

我更喜歡保留當前的方式,因為一些日志分析工具依賴它。 在Log4j2中可以嗎? 謝謝。

請注意這是否有效,但您可以嘗試在日期查找中使用double $$ 這允許在運行時解析變量。

<RollingFile name="ROLFILE"
    fileName="log-$${date:yyyy-MM-dd}.log"
    filePattern="oldlog-%d{yyyy-MM-dd}.log"
>

您可能需要小心確保活動輸出目標文件名與翻轉后文件名不同。 (我在上面的代碼段中使用了'oldlog'。)

最后,我編寫了自己的翻轉策略 ,該策略生成不同的翻轉操作集。 而是重命名活動文件,只需在RollingFileManager替換活動文件名。 是的,它是丑陋的反射黑客,並且必須使用與當前日期對應且具有相同模式的fileName常量初始化appender,例如

<RollingFile name="ROLFILE"
    fileName="log-${date:yyyy-MM-dd}.log"
    filePattern="log-%d{yyyy-MM-dd}.log"
>
    <SlidingFilenameRolloverStrategy />
    ...

但對我來說,這個解決方案值得做,盡管有這些小缺點。 (初始fileName永遠保留為AbstractManager注冊表MAP一個鍵,即使在管理器本身已被更改 - 似乎不介意,我也嘗試在注冊表中替換管理器中的新管理器但是不可能收集其構造所需的所有參數。)

我希望如果RollingFileManager API使正常的方式成為可能,那么這個hack應該不會那么難看。 我有一些希望看到這個javadoc,但框架AFAIK從不使用這個字段,更不用說改變RollingFileAppender

我認為它可以正常使用:

 fileName="log-${date:yyyy-MM-dd}.log"
 filePattern="log-%d{yyyy-MM-dd}.log"

我在log4j2版本2.5中使用它

這已在Log4j 2.8中實現(參見問題LOG4J2-1101 )。

目前它只適用於RollingFile appender,省略了filename參數並使用了DirectWriteRolloverStrategy

此外,此功能似乎與TimeBasedTriggeringPolicy存在一些問題(第一次翻轉不會發生,因此每個日志文件都會偏移一個間隔); CronTriggeringPolicy正常工作。

示例配置:

<RollingRandomAccessFile name="MyLogger"
    filePattern="logs/application.%d{yyyy-MM-dd}.log">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <Policies>
        <CronTriggeringPolicy schedule="0 * * * * ?" evaluateOnStartup="true"/>
    </Policies>
    <DirectWriteRolloverStrategy/>
</RollingRandomAccessFile>

問題LOG4J2-1878中請求支持RollingRandomAccessFile appender。

編輯: 找到TimeBasedTriggeringPolicy時遇到問題,更改為CronTriggeringPolicy策略。

暫無
暫無

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

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