在log4j中配置DST(夏令时)

时间:2014-11-11 05:01:45

标签: java log4j dst

我需要为在斐济的服务器中运行的某些应用程序配置DST时间。操作系统级别时间已正确配置:

Tue Nov 11 17:28:51 **FJST** 2014

(FJST - 斐济夏令时间)

我已经更改了log4j.xml配置,如下所示:

<layout class="org.apache.log4j.EnhancedPatternLayout">
  <param name="ConversionPattern" value="%d{ISO8601}{GMT+13} %-5p %c{1} [%x] [%t] - %m%n" />

这样做有点好,但这可能只是一种解决方法,不能成为解决方案。以下是两个问题:

  1. 需要重启所有应用程序两次。在每次DST更改期间,服务中断都将在那里。它不可能用于生产。

  2. 我们不能说,每天的时间变化都是+/- 1小时。有时它可能像50分钟。因此,在这种情况下,日志不会在适当的时间更新。

  3. 是否有任何补丁可用于以下java版本来解决此问题? - &#34; 1.7.0_09-icedtea&#34;

    否则有没有办法将log4j时间更改为OS时间?如果是这样,这将是一个很好的解决方案,因为不会有很多服务中断。

1 个答案:

答案 0 :(得分:0)

根据the docs for EnhancedPatternLayout%d之后的第二组大括号中的值是要在内部传递给TimeZone.getTimeZone(String)的字符串,该字符串应该是:

  

TimeZone的ID,可以是缩写,例如“PST”,全名,例如“America / Los_Angeles”,也可以是自定义ID,例如“GMT-8:00”。

因此,您应该能够通过Pacific/Fiji,以便在一年中的不同时间自动使用正确的时区偏移量。

<param name="ConversionPattern" value="%d{ISO8601}{Pacific/Fiji} %-5p %c{1} [%x] [%t] - %m%n" />

此外,历史上,斐济在设定DST日期时没有提供足够的通知。大多数国家都试图建立稳定的复发模式,但斐济选择在每个年度宣布DST变化。 2014年的最新变化是announced on Oct 20th,并于11月2日生效 - 仅剩12天时间来实施和分发对时区数据库的更改。 IANA tzdb group迅速采取行动releasing version 2014i on Oct 22,然后Oracle在10月31日发布了相应的TZUpdater 1.4.9以纳入此更改。

确保download TZUpdater 1.4.9 or greater并将其应用于您的环境。只要斐济不稳定,您将来也可能需要这样做。这意味着你不想重新开始生产的第一个要点是不可能的。人们无法预测政府。

关于你的第二个要点:世界上没有任何时区可以移动50分钟。所有使用DST的都移动了整整一个小时,但Australia/Lord_Howe移动了30分钟。