Associer un code d'erreur spécifique au contexte dans Log4J - Java - Programmation
Marsh Posté le 12-02-2004 à 10:35:00
Ta question n'est pas claire. Quels sont les contextes en question?
Marsh Posté le 12-02-2004 à 10:38:36
Eh bien, par exemple, si je suis susceptible de lever une exception comme une XMLException. Dans un cas ma XMLException sera associée à un code d'erreur 100 car elle intervient dans le chargement du paramétrage. Puis dans un cas de traitement d'un fichier XML quelconque, ce devra être un autre code d'erreur, disons 200, car le contexte sera différent.
Bref, le code d'erreur n'est pas spécifique à l'exception mais au contexte dans lequel celle-ci a été rencontrée.
Marsh Posté le 12-02-2004 à 10:39:59
Ca me fait vraiment marrer ca. Et donc log4j il est censé trouver tout seul les contextes en question. C'est meme pas basé sur l'exception?
Tu comptais faire comment excepté te palucher toutes tes lignes de log comme tu dis?
Marsh Posté le 12-02-2004 à 11:13:05
Est-ce-que t'es obligé de tout le temps prendre les gens de haut comme ça ? On sait que t'es une bête en java, c'est bon...
Je me doute bien que je vais être obligé, si je veux mettre quelquechose de propre en place, de retoucher à toute la gestion des exceptions. J'aurai pas dû mettre ça dans mon 1er post (que je voulais pas me "repalucher toute la gestion des exceptions" ).
Maintenant, comment est-ce-que je peux mettre en place de système de code d'erreur basé sur le contexte de la levée de l'exception ?
J'avais pensé à déclarer un attribut errorCode de type int dans une exception générique dont hériterait toutes mes exceptions. Puis à étendre les classes de Log4J pour gérer ce nouvel attribut...
Marsh Posté le 12-02-2004 à 11:16:55
non mais attends ca n'a rien à voir avec le fait d'etre bon en X ou Y. Je sais que je suis intélorant, je ne le nie pas mais bon ton post m'a donné l'impression que t'as pas réfléchi plus de 3 secondes et ca ca m'énerve
Bon alors y a plusieurs solutions.
# Tu crées ton propre logger qui hérite du logger de log4j et tu redéfinis les méthodes de log pour qu'elle accepte un code d'erreur
# Y a un truc en log4j qui permet d'attacher un contexte à une exception (MDC si mes souvenirs sont bon). Rien ne t'empeche d'attacher le code d'erreur en question et redéfinir PatternLayout pour qu'il accpète un nouveau tag qui serait un attribute de conctexte (ton code d'erreur quoi).
Si tu veux une autre solution que logger.error("[XYZA] Failed to ...", e); il va falloir redéfinir le comportement par défaut (toujours à ce que je sais)
Marsh Posté le 12-02-2004 à 11:26:34
Merci pour ta réponse.
En fait, si j'ai réfléchi + de 3 secondes à ce problème car j'y ai été déjà confronté par le passé chez 2 clients différents. A l'époque, j'avais créé une sorte de ApplicationException avec un attribut de type errorCode (int). A chaque fois que je levais une ApplicationException ou l'une de ses sous-classes, je passais au constructeur ce fameux code d'erreur dépendant du contexte.
J'avais aussi modifié le PatternLayout afin de gérer un nouveau "joker" (%e si je me rappelle bien) qui tentait sur l'exception à logger d'extraire le code d'erreur... Et aussi crée un nouveau PatternParser...
Ca marchait bien mais uniquement dans le cas où l'on loggait des exceptions.
Désormais je veux mettre en place le code d'erreur aussi quand je logge de simples messages...
je pense que je vais devoir m'en tenir à ce que j'ai déjà fait + faire ce que tu me conseilles, c-a-d, créer mon propre logger avec des méthodes error(int, String)...
Marsh Posté le 12-02-2004 à 11:35:23
si tu sais poster la solution, ca m'intéresse, j'ai jamais fait ca
J'ai acheté le bouquin de log4j et ca fait 2 semaines que j'attends que le poste me l'envoie
Marsh Posté le 12-02-2004 à 12:32:52
Voici les classes dont je parlais:
Exception "encapsulante" permettant de faire l'association exception <-> code d'erreur
Code :
|
Classe de type Layout spécialisée pour appeler le PatternParser qui va bien...
Code :
|
Parser spécialisé afin de gérer le joker ("%E" ) qui appelle le code d'erreur d'une TivoliException
Code :
|
Classe de test
Code :
|
J'ai étendu les classes de Log4J car ma 1ère implémentation était dégueulasse. J'avais fait ça dans l'urgence à l'époque !
Marsh Posté le 12-02-2004 à 10:32:49
Salut,
Je viens de me faire "avoir" encore chez un de mes clients chez qui je viens de passer une appli Java en production. Comme la machine va être infogérée, l'infogéreur va utiliser un système de "monitoring" genre Tivoli pour automatiser la surveillance des applis.
Problème: mon appli qui génère une log au format Log4J n'est pas "pluggable" telle quelle "sur" Tivoli. Il faut que pour chaque exception, message d'erreur qui est susceptible d'arriver, j'associe un code sur 4 positions numériques (par exemple) identifiant le contexte de l'erreur. A partir de ce code, Tivoli est capable de déclencher des alertes s'il a été correctement paramétre. Ensuite, pour chaque code d'erreur, on doit spécifier l'action que l'infogérance doit entreprendre...
Question: Comment puis-je faire sans avoir a me repalucher toutes les throw & catch d'exceptions pour insérer un code d'erreur spécifique au contexte de mon exception ?
PS: Dans le pire des cas, je mets en début du message que je logge mon code d'erreur comme "VWXY - Erreur JMS", ce qui crée une pseudo-colonne dans ma log... Mais je trouve pas ça terrible quand même
Merci de vos réponses