指定log4j日期的时区

cpjpxq1n  于 2022-11-06  发布在  其他
关注(0)|答案(6)|浏览(207)

是否可以指定log4j使用的时区?我需要日志文件中的日期与应用程序的时区不同。log4j的PatternLayout使用SimpleDateFormat。不幸的是,似乎没有一种方法可以通过模式字符串来控制SimpleDateFormat的时区(DateFormatsetTimeZone方法,但这没有帮助)。
我看了log4j的源代码,发现SimpleDateFormat是在PatternParser.finalizeConverter中被煽动的。不幸的是,没有一个简单的方法来获得DateFormat来设置时区。

dced5bon

dced5bon1#

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

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

您可以下载extras软件包here

fnx2tebb

fnx2tebb2#

我的案例...必须将模式布局更改为增强型模式布局。(log4j-1.2.17.jar)

增强的模式布局log4j.appender.logfile.layout.转换模式=[%d{ISO 8601}{GMT+9}]%-5 p- %m%n

dvtswwa3

dvtswwa33#

上面的日志模式有正确的想法,但不完全正确(你没有得到任何时间戳在日志)。
请使用以下模式:
%d{ISO8601}{GMT-5} %p [%c] - %m%n

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

mnowg1ta

mnowg1ta4#

最好使用类似{America/New_约克}而不是{GMT-5}的格式,因为如果使用夏令时,则通过指定时区将进行自动调整。指定类似GMT-5的格式将仅按指定的小时数调整GMT时区。

fdbelqdn

fdbelqdn5#

此外,如果您希望动态获取默认时区,则可以扩展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);
}
jc3wubiy

jc3wubiy6#

只需将用大括号括起来的时区附加到日期模式中的%d。
例如,使用%d{DEFAULT}{美洲/约克}而不是%d{DEFAULT}
(In log4j 2您可以使用常规的PatternLayout。在log4j 1(自1.2.16起)中,建议使用EnhancedPatternLayout。)

相关问题