2010-07-10 74 views
1

我有一個web應用程序,它在啓動時將服務器本地時區存儲在全局靜態成員中,然後將JVM的DefaultTimeZone設置爲GMT。帶時區的log4j問題

在啓動過程中,log4j將在服務器默認時區中記錄消息。

現在,當我在log4j.properties中更改日誌級別時,日誌級別會動態更改,現在log4j以GMT時間記錄消息。

我的要求是記錄郵件始終在服務器本地時區。

我如何在我的情況下實現這一目標?任何指針將非常感激。

謝謝

回答

3

現在,當我改變log4j.properties我的日誌級別的日誌級別是動態變化的

這意味着你已經配置的log4j觀看更改您的配置文件,一個配置,它not recommended for webapps (另請參閱this related SO question)。

什麼正在發生是這樣的

  1. 您的應用程序啓動時,log4j的初始化,TimeZone.getDefault()返回機器的時區
  2. 您更改默認的時區JVM範圍
  3. 您進行了更改log4j配置,log4j觀察器線程通知更改,重新初始化記錄器層次結構,看到新的默認時區

我會建議一個fe -W選項的位置:

  • 不要使用在到configureAndWatch一個servlet環境
  • 不要更改默認的TimeZone JVM範圍,因爲這會影響很多不相關的組件(如log4j的,因爲你已經看到)。相反,如果您的代碼需要以GMT格式輸出日期,請確保所有代碼都通過相同的代碼路徑來獲取您要使用的默認區域,例如,確保所有與時間相關的代碼調用像TimeZone getMyAppDefaultTimeZone()

更改僅適用於您的應用程序代碼需要的JVM範圍的默認值可能會導致更大的意外後果。

+0

聖潔的牛,然後我在這裏是完整的反模式。 – jch 2010-07-11 07:32:53

0

獲取您正在使用log4j的版本的源代碼和調查使用的是找到產生你看到的時間戳,其中追加程序。然後找出您需要在該位置實際完成的代碼,然後更新您的問題。

0

如果您使用的是log4cxx 0.9.7則默認時區爲GMT。獲取服務器的時區,並添加以下行配置打印日誌在香港時區(格林尼治標準時間+8:00)

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