2009-11-23 130 views
12

log4jが使用するタイムゾーンを指定することはできますか?ログファイルの日付は、アプリケーションとは異なるタイムゾーンにする必要があります。 log4jのPatternLayoutSimpleDateFormatを使用します。残念ながら、パターン文字列(DateFormatにはsetTimeZoneがありますが、それは役に立ちません)を介してSimpleDateFormatのタイムゾーンを制御する方法はありません。log4jの日付のタイムゾーンを指定する

log4jのソースを調べましたが、SimpleDateFormatPatternParser.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

私の場合、ロガーでは、{アメリカ/ニューヨーク} DEBUG [hi] - hiのようになっています。なぜそれが動作しないのかわかりません。 –

+1

1.2.16以降はlog4j自体の一部です –

4

上記のログパターンは正しいアイデアを持っていますが、完全には正しくありません(ログにはタイムスタンプがありません)。
確かに、このパターンを使用します。
%d{ISO8601}{America/New_York} %p [%c] - %m%n
または
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

おそらく、古いバージョン。とりあえずありがとう! – aditsu

8

私の場合... はEnhancedPatternLayoutにPatternLayoutはを変更する必要があります。 (log4j-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j。 EnhancedPatternLayout log4j.appender.logfile.layout.ConversionPattern = [%D {ISO8601} {GMT + 9}]% - 5P - %のM%Nまた

1

デフォルトのタイムゾーンをobtein dinamicalyするwhant場合、あなたはこのように「setConversionPattern」EnhancedPatternLayoutを拡張し、メソッドを上書きすることができます

@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

2

のようなものを使用することが好ましい{アメリカ/ニューヨーク}ではなく{GMT-5}タイムゾーンを指定することにより自動調整がされるので、夏時間の節約が行われている場合に作成されます。 GMT-5のようなものを指定すると、指定された時間だけGMTタイムゾーンが調整されます。

関連する問題