【问题标题】:Apache Log4j Logging with specific timezone具有特定时区的 Apache Log4j 日志记录
【发布时间】:2012-02-02 16:55:33
【问题描述】:

我希望日志应该包含特定时区的日期条目。有没有办法在log4j.properties 中强制时区?

现在我使用的是 JDK 1.5,正如您已经知道 JDK 1.5 中的时区错误已在 JDK 1.5 中删除。对于 JDK 1.5,它默认显示“GMT”时区。我想在 Log4j 中配置我的特定时区。

【问题讨论】:

  • 更具体一点,它现在看起来如何以及您希望它看起来如何?
  • @CatalinCiobanu 现在清楚了吗?

标签: java timezone log4j


【解决方案1】:

这将允许您在日志的每一行中查看时区信息:

%d{yyyy-MM-dd/HH:mm:ss.SSS/zzz}

诀窍是在模式中包含“zzz”,因为根据 java.text.SimpleDateFormat (http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html) 的 Javadoc,这就是时区的代码。 Log4J 使用与 SimpleDateFormat 相同的规则。

在 Log4J Javadoc 中有更多详细信息:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

在表格中查找“转换字符”为字母“d”的行。

【讨论】:

  • 它总是会在 jdk 1.5 中给我 GMT,这就是为什么我想要我的特定时区
  • 哦。对不起。在这种情况下,这是您的解决方案(需要一个“附加”罐子):stackoverflow.com/questions/1785725/…
  • 引用PatternLayout的javadoc的重要部分:虽然是标准JDK的一部分,但SimpleDateFormat的性能相当差。为了获得更好的结果,建议使用 log4j 日期格式化程序。这些可以使用字符串“ABSOLUTE”、“DATE”和“ISO8601”之一来指定,分别指定AbsoluteTimeDateFormat、DateTimeDateFormat和ISO8601DateFormat。例如,%d{ISO8601} 或 %d{ABSOLUTE}。
  • 是的,但是“很差”是指每秒可以处理 10,000 种格式。坦率地说,如果这代表了您的应用程序的主要性能瓶颈,那么您应该喝一杯香槟。
  • @JuliusDavies 通过使用额外的 jar 我在记录器中没有得到任何日期。请建议
【解决方案2】:

最好的方法是使用Apache Extras™ for Apache log4j™ 如果使用属性文件,请用 org.apache.log4j.EnhancedPatternLayout 替换正常的 PatternLayout:

//log4j.appender.xxx.layout = org.apache.log4j.PatternLayout
//Replaced by
log4j.appender.xxx.layout = org.apache.log4j.EnhancedPatternLayout

然后您可以在 ConversionPattern 中使用 %d{ISO8601}{GMT} 而不是 %d 以 GMT 格式显示您的日期。可以指定任何时区而不是 GMT

【讨论】:

    【解决方案3】:

    这需要三个步骤:

    1) 添加log4j-extras依赖here

    2) 将布局设​​置为 EnhancedPatternLayout: log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout(将 stdout 更改为您正在使用的任何附加程序)

    3) 在日期时间模式之后用大括号添加您的时区 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}{IST} %-5p %c{1}:%L - %m%n(在我的例子中是 IST)

    您可以参考 java herehere 中可用的时区 ID 列表

    【讨论】:

      【解决方案4】:

      使用org.apache.log4j.helpers.DateLayout作为布局类,并在其中使用属性timeZone

      【讨论】:

        【解决方案5】:

        在您的 ConversionPattern 中包含 date 参数。来自PatternLayout documentation:

        日期 -

        用于在本地时区输出日志记录事件的日期。 要以通用时间输出日期,请使用 %utcdate 模式。这 日期转换说明符后面可以跟日期格式说明符 括在大括号之间。例如,%date{HH:mm:ss,fff}%date{dd MMM yyyy HH:mm:ss,fff}。如果没有给出日期格式说明符,那么 假定为 ISO8601 格式 (Iso8601DateFormatter)。

        日期格式说明符采用与时间模式相同的语法 ToString 的字符串。

        为了获得更好的结果,建议使用 log4net 日期 格式化程序。这些可以使用字符串之一指定 “ABSOLUTE”、“DATE”和“ISO8601”用于指定 AbsoluteTimeDateFormatterDateTimeDateFormatter 和分别 Iso8601DateFormatter。例如,%date{ISO8601}%date{ABSOLUTE}

        这些专用日期格式化程序的性能明显优于 ToString.

        【讨论】:

        • 请注意,这似乎适用于 .net,不确定它是否适用于 Java——或者至少我找不到对等的,但我仍在寻找。
        【解决方案6】:

        您可以添加以下行

        log4j.appender.S.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss zzz}{GMT} %-5p [%t][%c:%M(%L)] %m%n
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 2013-11-08
          • 2020-12-07
          • 1970-01-01
          相关资源
          最近更新 更多