Geben Sie die Zeitzone des Datums des Log4j an
Frage
Ist es möglich, die Zeitzone anzugeben, die log4j verwendet wird? Ich brauche die Daten in der Protokolldatei, um eine andere Zeitzone als die Anwendung zu sein. log4j's PatternLayout
Verwendet SimpleDateFormat
. Leider scheint es keine Möglichkeit zu kontrollieren scheint SimpleDateFormat
Zeitzone über die Musterzeichenfolge (DateFormat
hat setTimeZone
Methode, aber das hilft nicht).
Ich schaute mir Log4js Quelle an und SimpleDateFormat
wird in eingeleitet PatternParser.finalizeConverter
. Leider gibt es keine einfache Möglichkeit, das zu erreichen DateFormat
So setzen Sie die Zeitzone.
Lösung
Wenn Sie die LOG4J Extras JAR -Datei auf Ihrem Klassenpfad verwenden, unterstützt die BETEMANDPATTERLAYOUT -Klasse diese Konfigurationsoption. Siehe den Javadoc bei dieser Link. Es wird als Teil der %D -Musterkomponente wie folgt behandelt:
log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n
Sie können das Extras -Paket herunterladen hier.
Andere Tipps
Mein Fall ... muss das MusterLayout in EnhancedPatternLayout ändern. (log4j-1.2.17.jar)
log4j.appender.logfile.layout = org.apache.log4j.EnhancedPatternLayoutlog4j.appender.logfile.layout.ConversionPattern = [%d {iso8601} {GMT+9}]% - 5p -%m%n
Das obige Protokollmuster hat die richtige Idee, 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
Es ist vorzuziehen, etwas wie {America/new_york} statt {GMT-5} zu verwenden, da durch Angeben einer Zeitzone eine automatische Anpassung erfolgt, wenn Tageslichteinsparungen in Betrieb sind. Wenn Sie so etwas wie GMT-5 angeben, wird die GMT-Zeitzone einfach an die angegebene Anzahl von Stunden angepasst.
Auch wenn Sie in der Standardzeitzone dinamisch -ungein wehten, können Sie die Methode "setConversionPattern" wie folgt erweitern und die Methode überschreiben:
@Override
public void setConversionPattern(String conversionPattern) {
String defaultTimeZoneId = TimeZone.getDefault().getID();
String conversionPatternModif = conversionPattern.replaceAll(
"\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)",
"%d{$1}{"+defaultTimeZoneId+"}$2");
super.setConversionPattern(conversionPatternModif);
}