指定log4j日期的时区

是否可以指定log4j将使用的时区? 我需要日志文件中的日期与应用程序的时区不同。 log4j的PatternLayout使用SimpleDateFormat 。 不幸的是,似乎没有办法通过模式字符串控制SimpleDateFormat的时区( DateFormatsetTimeZone方法,但这没有帮助)。

我查看了log4j的源代码,并且在PatternParser.finalizeConverter中正在使用SimpleDateFormat 。 不幸的是,没有一种简单的方法来保持DateFormat来设置时区。

如果在类路径上使用Log4J extras JAR文件,则EnhancedPatternLayout类支持此配置选项。 请参阅此链接中的Javadoc。 它作为%d模式组件的一部分处理,如下所示:

 log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n 

您可以在此处下载附加软件包。

我的案例……必须将patternLayout更改为EnhancedPatternLayout。 (log4j的-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j。 EnhancedPatternLayout log4j.appender.logfile.layout.ConversionPattern = [%d {ISO8601} {GMT + 9}]% – 5p – %m%n

上面的日志模式有正确的想法但不完全正确(您没有在日志中获得任何时间戳)。
使用此模式肯定:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
要么
%d{ISO8601}{GMT-5} %p [%c] - %m%n

最好使用{America / New_York}而不是{GMT-5}之类的东西,因为通过指定时区,如果夏令时可操作,将进行自动调整。 指定GMT-5之类的东西只会按指定的小时数调整GMT时区。

此外,如果您想要使用默认时区,则可以扩展EnhancedPatternLayout并覆盖方法“setConversionPattern”,如下所示:

 @Override public void setConversionPattern(String conversionPattern) { String defaultTimeZoneId = TimeZone.getDefault().getID(); String conversionPatternModif = conversionPattern.replaceAll( "\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)", "%d{$1}{"+defaultTimeZoneId+"}$2"); super.setConversionPattern(conversionPatternModif); }