2010-07-10 7 views
1

J'ai une application web qui, au démarrage, stocke le fuseau horaire local du serveur dans un membre statique global, puis définit la DefaultTimeZone de la JVM à GMT.log4j problème avec timezone

Au démarrage, log4j enregistre les messages dans le fuseau horaire par défaut du serveur. Maintenant, quand je change mon niveau de log dans log4j.properties le niveau de journal est changé dynamiquement et maintenant le log4j enregistre les messages en heure GMT.

Mon exigence est de consigner les messages toujours dans le fuseau horaire local du serveur.

Comment puis-je y parvenir dans mon scénario? les pointeurs seront vraiment appréciés.

Merci

Répondre

3

Maintenant, quand je change mon niveau de journal dans log4j.properties le niveau de journalisation est changé dynamiquement

Cela implique que vous avez configuré log4j pour regarder votre fichier de configuration pour les changements, une configuration qui est not recommended for webapps (voir également this related SO question).

Ce qui est INTERVENUES est quelque chose comme ça

  1. Votre application démarre, log4j est initialisé, TimeZone.getDefault() retourne le fuseau horaire
  2. de la machine que vous modifiez la valeur par défaut Timezone machine virtuelle Java à l'échelle
  3. Vous modifiez la config log4j, le thread observateur log4j remarque la modification, réinitialise la hiérarchie de l'enregistreur, voit le nouveau fuseau horaire par défaut

Je suggérerais un fe les options w ici:

  • Ne pas utiliser configureAndWatch dans un environnement de servlet
  • Ne changez pas la grande machine virtuelle Java décalage horaire par défaut, car cela peut avoir un impact beaucoup de composants non apparentés (tels que log4j, que vous avez vu). Au lieu de cela, si vous avez un code qui doit indiquer des dates dans GMT, assurez-vous que tout le code passe par le même chemin de code pour obtenir la zone par défaut que vous souhaitez utiliser, par exemple quelque chose comme TimeZone getMyAppDefaultTimeZone().

La modification des valeurs par défaut à l'échelle de la machine virtuelle Java pour quelque chose dont votre code d'application a seulement besoin peut avoir des conséquences inattendues beaucoup plus importantes.

+0

Les vaches sacrées alors ce que j'ai ici est complet anti-modèle. – jch

0

Obtenir le code source pour la version log4j que vous utilisez et Enquêter sur la Appender que vous utilisez pour localiser où l'horodatage que vous voyez est généré. Ensuite, déterminez le code dont vous avez réellement besoin à cet endroit, puis mettez à jour votre question.

0

Si vous utilisez log4cxx 0.9.7, le fuseau horaire par défaut sera GMT. Obtenir fuseau horaire de serveur et ajouter la ligne suivante à la configuration pour imprimer les journaux dans le fuseau horaire HK (GMT + 8: 00)

log4j.appender.R.layout.TimeZone=GMT-8:00