2017-03-15 197 views
1

在北美轉爲夏令時後,我們的日誌遇到了問題。在日誌翻轉策略導致其重置之前,日誌時間沒有變化,以反映時鐘「向前發展」。log4j和夏令時

我們用下面的圖案佈局和RollingRandomAccessFile附加器內的政策:

 <PatternLayout> 
      <Pattern>%d{ISO8601} traceId=%X{X-B3-TraceId} spanId=%X{X-B3-SpanId} [%-15.20t] %-5p %-20c{1.} : %m%n</Pattern> 
     </PatternLayout> 
     <Policies> 
      <TimeBasedTriggeringPolicy interval="1" modulate="true"/> 
      <!-- 100MB limit before log file is rolled over --> 
      <SizeBasedTriggeringPolicy size="100 MB" /> 
     </Policies> 

任何人都可以點我預期的行爲,這裏的log4j支持這種類型的情況?我們目前使用log4j版本2.4.1

+1

考慮爲您的日誌使用UTC時間戳。那麼你永遠不會有「時間變化」的問題。 –

回答

2

這可能是由在Log4j2使用了預定義的日期格式的FixedDateFormat類的issue with DST引起的(即有一個名稱,如默認情況下所有的格式,絕對的,緊湊型,DATE ISO8601和ISO8601_BASIC)。

該問題已得到解決,並將包含在即將發佈的Log4j 2.8.2版本中。

+0

正如我在這裏記錄的我猜:https://issues.apache.org/jira/browse/LOG4J2-1849 – KramKroc

1

在類似情況下,建議將TZ添加到您的模式中。既然你在貝爾法斯特(?我認爲倫敦是比較正確的,從Wikipedia),嘗試:

<Pattern>%d{ISO8601}{Europe/London} traceId=%X{X-B3-TraceId} spanId=%X{X-B3-SpanId} [%-15.20t] %-5p %-20c{1.} : %m%n</Pattern> 

Log4J 2 Layouts

d {pattern}的

日期{}模式

輸出記錄事件的日期。日期轉換說明符後面可以跟着一組包含每個SimpleDateFormat的日期和時間模式字符串的大括號。

預定義的格式爲DEFAULT,ABSOLUTE,COMPACT,DATE,ISO8601和ISO8601_BASIC。

您還可以使用一組大括號,其中包含每個java.util.TimeZone.getTimeZone的時區id。如果沒有給出日期格式說明符,則使用DEFAULT格式。

Pattern    Example 
%d{DEFAULT}   2012-11-02 14:34:02,781 
%d{ISO8601}   2012-11-02T14:34:02,781 
%d{ISO8601_BASIC} 20121102T143402,781 
%d{ABSOLUTE}  14:34:02,781 
%d{DATE}   02 Nov 2012 14:34:02,781 
%d{COMPACT}   20121102143402781 
%d{HH:mm:ss,SSS} 14:34:02,781 
%d{dd MMM yyyy HH:mm:ss,SSS} 02 Nov 2012 14:34:02,781 
%d{HH:mm:ss}{GMT+0} 18:34:02 
%d{UNIX}   1351866842 
%d{UNIX_MILLIS}  1351866842781 

可能重複:Configure DST(Daylight Savings Time) in log4j - 注意到有關TZUpdater的附加信息,如果它是適合您。

其他相關bug報告:How does log4j2 handle daylight savings