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

我看了log4j的来源 SimpleDateFormat 正在建立 PatternParser.finalizeConverter. 。不幸的是,没有一种简单的方法来掌握 DateFormat 设置时区。

有帮助吗?

解决方案

如果您在类路径上使用Log4J Extras Jar文件,则EnhancedPatternlayout类支持此配置选项。在 这个链接. 。它是作为这样的%d模式组件的一部分处理的:

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

您可以下载额外的包裹 这里.

其他提示

我的情况...必须将模式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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top