質問

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

Log4Jのソースを見ました SimpleDateFormat インスピレーションを受けています PatternParser.finalizeConverter. 。残念ながら、を手に入れる簡単な方法はありません DateFormat タイムゾーンを設定します。

役に立ちましたか?

解決

classPathでlog4jエクストラJARファイルを使用する場合、拡張パターンレイアウトクラスはこの構成オプションをサポートします。でJavadocを参照してください このリンク. 。このような%Dパターンコンポーネントの一部として処理されます。

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

エキストラパッケージをダウンロードできます ここ.

他のヒント

私のケースは、PatternLayoutを拡張Patternlayoutに変更する必要があります。 (log4j-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j。EnhancedPatternlayoutlog4j.appender.logfile.layout.conversionpattern = [%d {iso8601} {gmt+9}]%-5p-%m%n

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

{gmt-5}よりも{America/new_york}のようなものを使用することが望ましいです。タイムゾーンを指定することにより、夏時間が動作している場合は自動調整が行われるからです。 GMT-5のようなものを指定すると、指定された時間だけGMTタイムゾーンを調整します。

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

@Override
public void setConversionPattern(String conversionPattern) {
    String defaultTimeZoneId = TimeZone.getDefault().getID();
    String conversionPatternModif = conversionPattern.replaceAll(
        "\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)", 
        "%d{$1}{"+defaultTimeZoneId+"}$2");

    super.setConversionPattern(conversionPatternModif);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top