【问题标题】:Specify time zone of log4j's date指定 log4j 日期的时区
【发布时间】:2009-11-23 20:29:31
【问题描述】:

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

我查看了 log4j 的源代码,SimpleDateFormat 正在 PatternParser.finalizeConverter 中实例化。不幸的是,获取DateFormat 来设置时区并不容易。

【问题讨论】:

    标签: java datetime timezone log4j


    【解决方案1】:

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

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

    您可以下载附加包here

    【讨论】:

    • 在我的记录器中,它以 {America/New_York} DEBUG [hi] - hi.. 我不知道为什么它不起作用
    • 从 1.2.16 开始,它是 log4j 本身的一部分
    • @khill 链接已失效
    【解决方案2】:

    我的情况... 必须将 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        最好使用类似 {America/New_York} 而不是 {GMT-5} 的内容,因为通过指定时区,如果夏令时有效,则会进行自动调整。指定类似 GMT-5 的内容只会将 GMT 时区调整指定的小时数。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            只需将大括号包围的时区附加到您的date pattern 中的%d。

            例如%d{DEFAULT}{America/New_York} 而不是 %d{DEFAULT}

            (在 log4j 2 中,您可以使用常规 PatternLayout。从 1.2.16 开始,在 log4j 1 中,已包含并推荐使用 EnhancedPatternLayout。)

            【讨论】:

              猜你喜欢
              • 2018-11-25
              • 2011-09-08
              • 2014-01-17
              • 1970-01-01
              • 2011-09-16
              • 2014-05-17
              • 2013-09-21
              • 1970-01-01
              • 2013-12-30
              相关资源
              最近更新 更多