2017-03-15 222 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