2009-11-23 43 views
12

是否可以指定log4j將使用的時區?我需要日誌文件中的日期與應用程序的時區不同。 log4j的PatternLayout使用SimpleDateFormat。不幸的是,似乎沒有辦法通過模式字符串來控制SimpleDateFormat的時區(DateFormatsetTimeZone方法,但這沒有幫助)。指定log4j日期的時區

我看着log4j的來源,SimpleDateFormat正在PatternParser.finalizeConverter中被觀察。不幸的是,有一個簡單的方法來獲取DateFormat來設置時區。

回答

16

如果在類路徑中使用Log4J extras JAR文件,EnhancedPatternLayout類將支持此配置選項。請參閱Javadoc this link。它的處理是這樣的%d模式成分的一部分:

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

您也可以下載額外包here

+0

在我的情況在記錄器它來到{America/New_York} DEBUG [嗨] - 嗨..我不知道爲什麼它不工作 – 2012-02-06 10:00:27

+1

自1.2.16它是log4j本身的一部分 – 2015-03-05 21:25:07

4

上面的日誌模式有正確的想法,但不完全正確(你沒有在日誌中得到任何時間戳)。
使用此模式肯定:
%d{ISO8601}{America/New_York} %p [%c] - %m%n

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

+0

也許它工作在舊版本。不管怎樣,謝謝! – aditsu 2012-03-23 05:16:17

8

我的情況...... 必須的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 - %米%N

1

此外,如果你whant到dinamicaly obtein默認時區,可以延長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); 
} 
+0

謝謝,這對我有用:) – toantran 2015-04-24 03:31:44

2

優選的是使用類似{美國/紐約}而不是{GMT-5},因爲通過指定一個時區的自動調整將如果夏令時正在運行,則會產指定類似於GMT-5的內容將簡單地將GMT時區調整指定的小時數。