2009-11-23 17 views
12

¿Es posible especificar la zona horaria que utilizará log4j? Necesito que las fechas en el archivo de registro sean una zona horaria diferente a la de la aplicación. log4j's PatternLayout usa SimpleDateFormat. Lamentablemente, no parece haber una forma de controlar el huso horario de SimpleDateFormat a través de la cadena del patrón (DateFormat tiene el método setTimeZone pero eso no ayuda).Especifique la zona horaria de la fecha log4j

Miré fuente de log4j y SimpleDateFormat está siendo instigado en PatternParser.finalizeConverter. Lamentablemente, no hay una forma fácil de obtener el DateFormat para establecer la zona horaria.

Respuesta

16

Si utiliza el archivo JAR Log4J extras en su classpath, la clase EnhancedPatternLayout admite esta opción de configuración. Vea el Javadoc en this link. Se maneja como parte del componente de patrón de% D como esta:

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

Usted puede descargar el paquete de extras here.

+0

En mi caso en el registrador viene como {America/New_York} DEPURDE [hi] - hola ... No sé por qué no está funcionando –

+1

desde 1.2.16 es parte de log4j en sí –

4

El patrón de registro anterior tiene la idea correcta, pero no es del todo correcta (no obtiene ninguna marca de tiempo en el registro).
utilizar este modelo segura:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
o
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

Tal vez funcionó en una versión anterior. ¡Gracias de todos modos! – aditsu

8

mi caso ... debe cambiar el 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

También si whant a dinamicaly obtein la zona horaria predeterminada, se puede extender EnhancedPatternLayout y sobrescribir el método "setConversionPattern" de esta manera:

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

    super.setConversionPattern(conversionPatternModif); 
} 
+0

gracias, esto funciona para mí :) – toantran

2

es preferible usar algo como {America/New_York} en lugar de {GMT-5} porque especificando una zona horaria un ajuste automático será hecho si el horario de verano es operacional. Especificar algo como GMT-5 simplemente ajustará la zona horaria GMT en la cantidad de horas especificada.

Cuestiones relacionadas