在北美转为夏令时之后,我们的日志遇到了问题。日志时间没有变化以反映时钟"向前跳跃"直到日志翻转策略导致它重置。
我们在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
答案 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>
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的其他信息,如果它适合您。