2009-11-23 18 views
12

Kann die Zeitzone angegeben werden, die log4j verwenden soll? Ich brauche die Daten in der Protokolldatei als eine andere Zeitzone als die der Anwendung. log4j's PatternLayout verwendet SimpleDateFormat. Leider scheint es keine Möglichkeit zu geben, die Zeitzone SimpleDateFormat über die Musterzeichenfolge zu steuern (DateFormat hat setTimeZone Methode, aber das hilft nicht).Zeitzone des Log4j-Datums angeben

Ich sah Log4j Quelle und SimpleDateFormat wird in PatternParser.finalizeConverter instantiiert. Leider gibt es keinen einfachen Weg, um die DateFormat Zeitzone zu erreichen.

Antwort

16

Wenn Sie die Log4J-Extras-JAR-Datei für Ihren Klassenpfad verwenden, unterstützt die EnhancedPatternLayout-Klasse diese Konfigurationsoption. Siehe das Javadoc unter this link. Es ist, als Teil der% d Musterkomponente wie folgt behandelt:

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

Sie können die Extras Paket here.

+0

In meinem Fall im Logger kommt es als {America/New_York} DEBUG [hi] - hi .. Ich weiß nicht, warum es nicht funktioniert –

+1

seit 1.2.16 ist es Teil von Log4j selbst –

4

Das Protokollmuster oben ist richtig, aber nicht vollständig korrekt (Sie erhalten keinen Zeitstempel im Protokoll).
Verwenden Sie dieses Muster sicher:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
oder
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

Vielleicht hat es funktioniert eine ältere Version. Trotzdem danke! – aditsu

8

meinem Fall ... müssen die Pattern zu EnhancedPatternLayout ändern. (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

Auch wenn Sie die Standardzeitzone dinamicaly obtein whant, Sie können EnhancedPatternLayout erweitern und die Methode „setConversionPattern“ wie folgt überschrieben:

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

    super.setConversionPattern(conversionPatternModif); 
} 
+0

danke, das funktioniert für mich :) – toantran

2

Es ist bevorzugt, etwas zu verwenden, wie {America/New_York} anstatt {GMT-5}, weil durch eine Zeitzone eine automatische Anpassung spezifiziert wird wenn die Sommerzeit in Betrieb ist. Wenn Sie etwas wie GMT-5 angeben, wird die GMT-Zeitzone einfach um die angegebene Stundenanzahl angepasst.

Verwandte Themen