Question

Je souhaite créer un Appender (ou quelque chose de similaire) qui inspecte les événements et, dans certaines conditions, crée un journal pour les nouveaux événements.

Voici un exemple: Appender Escalating qui vérifie si un certain nombre d’événements identiques sont consignés et, si tel est le cas, enregistre l’événement avec un nombre plus élevé de journaux. Vous pouvez donc définir quelque chose comme: Si vous obtenez plus de 10 avertissements identiques sur cet enregistreur, faites-en une erreur.

Mes questions sont donc les suivantes:

  1. Existe-t-il déjà quelque chose comme cela?

  2. Un appeleur est-il la bonne classe pour implémenter ce comportement?

  3. Y a-t-il des pièges auxquels vous pourriez penser que je devrais surveiller?

Clarification: Je suis d'accord avec l'algorithme de collecte et d'analyse des événements. Je vais le faire avec une collection à l'intérieur de l'appender. La persistance n'est pas nécessaire pour mon but. Ma question n ° 2 est la suivante: un apprenti est-il le bon endroit pour ce faire? Après tout, il n’est pas normal de créer des entrées de journalisation pour un appender.

Était-ce utile?

La solution

Logback (le successeur de log4j) vous permettra d'activer la journalisation pour tout événement via TurboFilters . Par exemple, en supposant qu'un même événement se produise au moins N fois dans une période donnée, vous pouvez forcer l'acceptation de l'événement (quel que soit son niveau). Voir aussi DuplicateMessageFilter qui effectue l'inverse (en refusant les événements récurrents).

Cependant, même la consignation ne permettra pas d'incrémenter le niveau de l'événement de journalisation. Log4j ne le sera pas non plus. Aucun des deux frameworks n'est conçu pour cela et je vous déconseillerais d'essayer d'incrémenter le niveau à la volée et dans le même fil. D'autre part, l'incrémentation du niveau lors du post-traitement est une tout autre affaire. Signaler à un autre thread de générer un nouvel événement de journalisation avec un niveau supérieur est une possibilité supplémentaire. (Demandez à votre turbo-filtre de signaler à un autre thread de générer un nouvel événement de journalisation de niveau supérieur.)

D'après votre question, il n'était pas clair pourquoi vous souhaitiez que le niveau soit incrémenté. L’incrément du niveau était-il une raison en soi ou était-il un moyen d’atteindre un objectif, c’est-à-dire que l’événement était enregistré, quel que soit son niveau? Dans ce dernier cas, les TurboFilters de logback sont la solution.

HTH,

Autres conseils

Vous pouvez créer votre propre appender en implémentant l'interface Appender fournie par log4j.

http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/Appender.html

Ce serait une approche. Une autre solution consisterait à utiliser un générateur d'appels existant, puis à écrire du code surveillant le journal. Par exemple, vous pouvez vous connecter à la base de données, puis écrire un processus qui surveille les entrées de journal dans la base de données et crée des méta-événements en fonction de ce qu'il voit.

Cela dépend surtout de ce avec quoi vous êtes à l'aise. Une question que vous devrez résoudre est de savoir comment revenir en arrière dans le journal pour créer vos méta-événements. Vous devez soit accumuler des événements dans votre éditeur, soit les conserver dans un endroit que vous pouvez interroger pour créer vos méta-événements. Le problème avec leur accumulation est que si vous arrêtez et démarrez votre processus, vous devrez soit les vider quelque part pour les récupérer, soit les redémarrer à chaque redémarrage du processus.

Par exemple, supposons que je souhaite créer une entrée de journal chaque 10 fois qu'une NullPointerException est émise. Si j'ai les entrées de journal dans une base de données, à chaque fois qu'un NPE est lancé, je lance une requête pour savoir combien de NPE ont été lancés depuis la dernière fois que j'ai créé une entrée de journal pour eux. Si je ne les compte qu'en mémoire à chaque lancement, si je relance l'application après 5, si je ne persiste pas, je perds le compte.

Comme Rafe l’a déjà indiqué, le plus grand défi serait de conserver les événements réels dans Appender , afin que vous sachiez qu’il est temps de déclencher votre événement (par exemple, augmenter le niveau de journalisation).

Par conséquent, je propose une stratégie suivante:

  1. Utilisez un un JDBCAppender personnalisé . Contrairement à celui fourni avec Log4j, celui-ci peut enregistrer les exceptions.
  2. Configurer une base de données intégrée, telle que HSQLDB , et configurer une base de données avec une table pour la consignation d'événements . Il résout le problème de persistance, car vous pouvez utiliser SQL pour rechercher les types d'événements survenus.
  3. Exécutez un thread distinct qui surveille la base de données et détecte les modèles d'événements souhaités.
  4. Utilisez un LogManager pour y accéder. Enregistreur souhaités et définissez leur niveau manuellement .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top