Specificare il fuso orario della data di Log4j
Domanda
È possibile specificare il fuso orario che Log4j utilizzerà? Ho bisogno che le date nel file di registro siano un fuso orario diverso da quello dell'applicazione. log4j's PatternLayout
usi SimpleDateFormat
. Purtroppo non sembra esserci un modo per controllare SimpleDateFormat
fuso orario tramite la stringa di pattern (DateFormat
ha setTimeZone
metodo ma questo non aiuta).
Ho guardato la fonte di Log4j e SimpleDateFormat
viene ispirato in PatternParser.finalizeConverter
. Purtroppo non c'è un modo semplice per ottenere una presa del DateFormat
Per impostare il fuso orario.
Soluzione
Se si utilizza il file JAR di Log4j Extras sul tuo percorso di classe, la classe EnhancedPatternLayout supporta questa opzione di configurazione. Vedi il Javadoc a questo link. È gestito come parte del componente del modello %d come questo:
log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n
Puoi scaricare il pacchetto extras qui.
Altri suggerimenti
Il mio caso ... deve cambiare il patternLayout in potenziatopatternlayout. (log4j-1.2.17.jar)
log4j.appender.logfile.layout = org.apache.log4j.EnhancedPatternLayoutlog4j.appender.logfile.layout.conversionpattern = [%d {ISO8601} {GMT+9}]% - 5p -%m%n
Il modello di registro sopra ha un'idea giusta ma non è completamente corretto (non si ottiene alcun timestamp nel registro).
Usa questo modello di sicuro:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
o
%d{ISO8601}{GMT-5} %p [%c] - %m%n
È preferibile usare qualcosa come {America/New_york} anziché {GMT-5} perché specificando un fuso orario verrà effettuata una regolazione automatica se il risparmio diurno è operativo. Specificare qualcosa come GMT-5 regolerà semplicemente il fuso orario GMT entro la quantità di ore specificate.
Inoltre, se si svuota il fuso orario predefinito, è possibile estendere il maestro e sovrascrivere il metodo "setConversionPattern" in questo modo:
@Override
public void setConversionPattern(String conversionPattern) {
String defaultTimeZoneId = TimeZone.getDefault().getID();
String conversionPatternModif = conversionPattern.replaceAll(
"\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)",
"%d{$1}{"+defaultTimeZoneId+"}$2");
super.setConversionPattern(conversionPatternModif);
}