log4j问题与时区

时间:2010-07-10 06:37:58

标签: java log4j

我有一个Web应用程序,在启动时将服务器本地时区存储在全局静态成员中,然后将JVM的DefaultTimeZone设置为GMT。

在启动期间,log4j以服务器默认时区记录消息。

现在,当我在log4j.properties中更改日志级别时,日志级别会动态更改,现在log4j会以GMT时间记录消息。

我的要求是始终在服务器本地时区记录消息。

我如何在我的场景中实现这一目标?任何指针都会非常感激。

谢谢

3 个答案:

答案 0 :(得分:3)

  

现在,当我在log4j.properties中更改日志级别时,日志级别会动态更改

这意味着您已将log4j配置为监视配置文件中的更改,配置为not recommended for webapps(另请参阅this related SO question)。

发生的是这样的事情

  1. 你的应用启动,log4j初始化,TimeZone.getDefault()返回机器的时区
  2. 您更改默认的Timezone JVM范围
  3. 您对log4j配置进行了更改,log4j观察程序线程注意到更改,重新初始化记录器层次结构,查看新的默认时区
  4. 我在这里建议一些选择:

    • 不要在servlet环境中使用configureAndWatch
    • 不要更改默认的TimeZone JVM范围,因为这会影响许多不相关的组件(例如log4j,如您所见)。相反,如果您的代码需要在GMT中输出日期,请确保所有代码都通过相同的代码路径来获取您要使用的默认区域,例如确保所有与时间相关的代码调用像TimeZone getMyAppDefaultTimeZone()这样的东西。

    仅针对应用程序代码所需的内容更改JVM范围的默认值会产生更大的意外后果。

答案 1 :(得分:0)

获取您正在使用的log4j版本的源代码,并调查您正在使用的Appender,以查找生成的时间戳的位置。然后找出你需要在该位置实际完成的代码,然后更新你的问题。

答案 2 :(得分:0)

如果您使用的是 log4cxx 0.9.7 ,则默认时区将为GMT。获取服务器的时区并在配置中添加以下行以在HK时区打印日志(GMT + 8:00)

log4j.appender.R.layout.TimeZone=GMT-8:00