log4j和夏令时

时间:2017-03-15 15:35:07

标签: java logging configuration log4j log4j2

在北美转为夏令时之后,我们的日志遇到了问题。日志时间没有变化以反映时钟"向前跳跃"直到日志翻转策略导致它重置。

我们在RollingRandomAccessFile appender中使用以下Pattern Layout和Policies:

        <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

2 个答案:

答案 0 :(得分:2)

这可能是由于FixedDateFormat类中的issue with DST导致Log4j2用于预定义的日期格式(所有具有名称的格式,如DEFAULT,ABSOLUTE,COMPACT,DATE,ISO8601和ISO8601_BASIC)。

该问题已得到修复,将包含在即将发布的Log4j 2.8.2版本中。

答案 1 :(得分: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的其他信息,如果它适合您。

其他相关错误报告:How does log4j2 handle daylight savings