Spécifiez le fuseau horaire de la date de log4j
Question
Est-il possible de spécifier le fuseau horaire LOG4J utilisera? J'ai besoin des dates dans le fichier journal à un fuseau horaire différent de celui de l'application. La PatternLayout
de log4j utilise SimpleDateFormat
. Malheureusement, il ne semble pas être un moyen de contrôler le fuseau horaire de SimpleDateFormat
via la chaîne de motif (DateFormat
méthode a setTimeZone
mais cela ne permet pas).
Je regardais la source de log4j et SimpleDateFormat
est en cours d'instiantiated dans PatternParser.finalizeConverter
. Malheureusement, il n'y a pas un moyen facile d'obtenir une prise de DateFormat
pour définir le fuseau horaire.
La solution
Si vous utilisez le fichier extras Log4J JAR sur votre chemin de classe, la classe EnhancedPatternLayout prend en charge cette option de configuration. Voir la Javadoc ce lien . Elle est traitée dans le cadre du% d composant de motif comme suit:
log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n
Autres conseils
Mon cas ... doit changer le PatternLayout à 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
Le modèle de journal a surtout bonne idée, mais pas tout à fait correcte (vous ne recevez pas d'horodatage dans le journal).
Utilisez ce modèle pour vous:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
ou
%d{ISO8601}{GMT-5} %p [%c] - %m%n
Il est préférable d'utiliser quelque chose comme {America /} plutôt que New_York {GMT-5} car en spécifiant un fuseau horaire à un ajustement automatique sera effectué si l'heure d'été est opérationnel. Spécification quelque chose comme GMT-5 ajustera simplement le fuseau horaire de GMT par la quantité d'heures.
Aussi, si vous whant à dinamicaly obtein le fuseau horaire par défaut, vous pouvez étendre EnhancedPatternLayout et remplacer la méthode « set ConversionPattern » comme ceci:
@Override
public void setConversionPattern(String conversionPattern) {
String defaultTimeZoneId = TimeZone.getDefault().getID();
String conversionPatternModif = conversionPattern.replaceAll(
"\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)",
"%d{$1}{"+defaultTimeZoneId+"}$2");
super.setConversionPattern(conversionPatternModif);
}