是否可以指定log4j将使用的时区?我需要日志文件中的日期与应用程序的时区不同。 log4j的PatternLayout
使用SimpleDateFormat
。很遗憾,似乎没有办法通过模式字符串控制SimpleDateFormat
的时区(DateFormat
有setTimeZone
方法,但这没有帮助。)
我查看了log4j的来源,SimpleDateFormat
正在PatternParser.finalizeConverter
中进行了宣传。不幸的是,没有一种简单的方法可以暂停DateFormat
来设置时区。
答案 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);
}