指定log4j日期的时区

时间:2009-11-23 20:29:31

标签: java datetime timezone log4j

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

我查看了log4j的来源,SimpleDateFormat正在PatternParser.finalizeConverter中进行了宣传。不幸的是,没有一种简单的方法可以暂停DateFormat来设置时区。

5 个答案:

答案 0 :(得分:16)

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

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

您可以下载临时包here

答案 1 :(得分:9)

我的案例...... 必须将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

答案 2 :(得分:4)

上面的日志模式有正确的想法但不完全正确(你没有在日志中获得任何时间戳) 请务必使用此模式:
%d{ISO8601}{America/New_York} %p [%c] - %m%n

%d{ISO8601}{GMT-5} %p [%c] - %m%n

答案 3 :(得分:2)

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

答案 4 :(得分:1)

此外,如果您想动态地使用默认时区,您可以扩展EnhancedPatternLayout并覆盖方法“set ConversionPattern”,如下所示:

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

    super.setConversionPattern(conversionPatternModif);
}