题
是否可以指定Log4J将使用的时区?我需要日志文件中的日期与应用程序的时区不同。 log4j的 PatternLayout
用途 SimpleDateFormat
. 。不幸的是,似乎没有一种控制方法 SimpleDateFormat
通过模式字符串的时区(DateFormat
有 setTimeZone
方法但这无济于事)。
我看了log4j的来源 SimpleDateFormat
正在建立 PatternParser.finalizeConverter
. 。不幸的是,没有一种简单的方法来掌握 DateFormat
设置时区。
其他提示
我的情况...必须将模式layout更改为增强的patternlayout。 (log4j-1.2.17.jar)
log4j.appender.logfile.layout = org.apache.log4j。增强patternlayoutlog4j.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时区。
另外,如果您可以在默认时区到dinamicaly obtein,则可以扩展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);
}