2009-11-23 10 views
12

È possibile specificare il fuso orario che log4j utilizzerà? Ho bisogno che le date nel file di log siano un fuso orario diverso da quello dell'applicazione. PatternLayout di log4j utilizza SimpleDateFormat. Purtroppo non sembra essere un modo per controllare il fuso orario tramite la stringa del modello (DateFormat ha il metodo setTimeZone ma ciò non aiuta).Specificare il fuso orario della data di log4j

Ho guardato la fonte di log4j e SimpleDateFormat viene instiantiato in PatternParser.finalizeConverter. Sfortunatamente non esiste un modo semplice per ottenere una sospensione dello DateFormat per impostare il fuso orario.

risposta

16

Se si utilizza il file JAR extra Log4J sul classpath, la classe EnhancedPatternLayout supporta questa opzione di configurazione. Vedere il Javadoc a this link. E 'gestita come parte del componente modello% d in questo modo:

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

È possibile scaricare il pacchetto extra here.

+0

Nel mio caso nel registratore viene come {America/New_York} DEBUG [ciao] - ciao .. Non so perché non funziona –

+1

dal 1.2.16 fa parte di log4j stesso –

4

Il modello di registro sopra ha l'idea giusta ma non completamente corretto (non si ottiene alcun timestamp nel registro).
Utilizzare questo schema di sicuro:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
o
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

Forse ha funzionato in una versione precedente. Comunque grazie! – aditsu

8

mio caso ... necessario modificare il PatternLayout a EnhancedPatternLayout. (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

Anche se si whant al dinamicaly obtein il fuso orario predefinito, è possibile estendere EnhancedPatternLayout e sovrascrivere il metodo "setConversionPattern" come questo:

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

    super.setConversionPattern(conversionPatternModif); 
} 
+0

grazie, questo funziona per me :) – toantran

2

e 'preferibile usare qualcosa come {America/New_York} invece di {GMT-5} perché specificando un fuso orario una regolazione automatica sarà fatto se l'ora legale è operativa. Specificare qualcosa come GMT-5 semplicemente regolerà il fuso orario GMT in base al numero di ore specificato.

Problemi correlati