Log4j configureAndWatch () fraie des milliers de fils

voix
2

Nous avons donc notre application J2EE en utilisant Log4j comme celui-ci

public class CustomerController 
{
    private static Logger logger = Logger.getLogger(CustomerController.class);

     public CustomerService customerservice = null;

     public CustomerController() throws Exception 
     {
           PropertyConfigurator.configureAndWatch(c:\log4j.property, 50000);

            customerservice = ServiceManagerSingleton.getCustomerServiceInstance();
     }
}

De cette façon, nous pouvons changer le temps réel au niveau du journal. Très utile. La plupart de nos cours sont mis en place comme ce contrôleur. Nous utilisons le singleton-modèle afin que nous ayons une seule instance de la classe eash; un appel à PropertyConfigurator.configureAndWatch () pour chaque classe, une fois.

Le problème: Environ deux fois par semaine, notre serveur d'applications meurt et crée un heapdump. En utilisant Heap Analyzer d'IBM, nous pouvons voir qu'il semble y avoir beaucoup de discussions liées à Log4j:

 808 (0%) [200] 9 org/apache/log4j/PropertyWatchdog 0x14282ad8

Environ 30.000 au total. Donc, ce qui est probablement la raison de l'accident soudain.

  1. Préparons-nous ce correctement?
  2. Qu'est-ce qui arrive à tous ces fils lorsque l'oreille est redéployé?
Créé 26/08/2009 à 22:57
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
7

Comment sont souvent des cas CustomerController créés? Une fois par demande? Parce que je crois que configureAndWatch () va lancer un nouveau thread à chaque appel.

En outre, si vous n'êtes pas au courant, les docs log4j mettent en garde contre l' utilisation de cette fonction dans un environnement J2EE:

Parce que le configureAndWatch lance un fil de wathdog séparé, et parce qu'il n'y a aucun moyen d'arrêter ce fil dans log4j 1.2, la méthode configureAndWatch est dangereux pour une utilisation dans des environnements J2EE où les applications sont recyclés.

Je sais que vous ne l' utilisez Spring , mais à mon avis , la Log4jWebConfigurer classe de printemps a une meilleure explication sur les raisons de cette fonctionnalité est dangereuse J2EE:

AVERTISSEMENT: le fil de surveillance de Log4j ne se termine pas avant l' arrêt VM; en particulier, elle ne se termine pas à l' arrêt LogManager. Par conséquent, il est recommandé de ne pas utiliser le fichier de configuration rafraîchissant dans un environnement J2EE de production; le fil de surveillance ne s'arrêterait pas à l' arrêt de l' application il.

Mise à jour: la recherche à la source log4j, chaque appel à configureAndWatch () ne fait créer un nouveau thread .

Créé 27/08/2009 à 03:22
source utilisateur

voix
4

Vraiment ce que vous devez faire ici est d'utiliser la procédure de démarrage de votre serveur d'applications (ils sont tous différents) pour initialiser le système de log4j. Parce que Log4j repose sur des variables statiques, il ne peut pas vraiment travailler de façon autonome dans sa propre oreille (ce genre peuvent, mais cela dépend vraiment du serveur d'applications). Dans la plupart des cas, la configuration va vraiment être globale pour l'ensemble du serveur d'applications.

Vous devez être sûr que la méthode PropertyConfigurator.configureAndWatch est appelée une seule fois. Une façon de le faire est de mettre quelque chose dans JNDI.

Beaucoup de cela va dépendre de ce que le serveur d'application vous donne. Par exemple, nous utilisons JBoss, et Log4J est configuré dans le cadre de celui-ci, et que vous modifiez simplement le fichier log4j.xml pour inclure ce que vos classes ont besoin. JBoss assure qu'il se fait dynamiquement.

EDIT: Voici les instructions pour Websphere pour créer un service personnalisé, et à l' intérieur que vous créez votre configuration log4J, et faire votre suivi du dossier. Quelques mises en garde. Vous allez devoir ajouter le log4j.jar au classpath du serveur d'application lui - même, de sorte qu'il est disponible à la guerre ou de l' oreille (je suis sûr que cela fonctionnera, de toute façon), et le service personnalisé ne sera probablement pas travailler à l' intérieur de l'oreille.

Voici une alternative qui gardera tout dans la guerre ou de l' oreille, mais au détriment des changements de chargement de grumes dynamiquement.

Créé 26/08/2009 à 23:22
source utilisateur

voix
0

Tous les journaux partagent le même fichier de configuration, donc si toutes les classes qui utilise un enregistreur contient ce code d'initialisation, chaque appel engendreront probablement un nouveau fil de veilleur configureAndWatch (). (À mon humble avis, Log4j devrait savoir mieux et permettre au plus un veilleur thread par fichier de configuration, mais apparemment il ne fonctionne pas)

Créé 27/08/2009 à 08:46
source utilisateur

voix
0

Avez - vous regardé logback, successeur de log4j? Il traite de rechargeant sa configuration soit en fil ou via JMX . Les deux approches éviter les maux de tête causés par l' appel PropertyConfigurator.configureandWatch () ou DOMConfigurator.configurator. Tout comme intéressant, l'approche fil activée via un fichier de configuration (pas de code personnalisé nécessaire).

Créé 27/08/2009 à 08:34
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more