OVH Cloud OVH Cloud

log4perl: comment envoyer toutes les alertes si au moins une au dessus d'un certain seuil ?

2 réponses
Avatar
Papo
Bonjour à tous,

J'ai 2 problèmes que je cherche à résoudre avec log4perl, si quelqu'un a un
avis dessus ça serait très sympa de me tuyauter sur une solution:

1/ j'ai paramétré log4perl pour qu'il log tout dans un fichier et sur
l'écran et aussi pour qu'il m'envoie un mail mais uniquement en cas d'erreur
de l'appli (minlevel = error), ça marche mais évidement le mail ne contient
que les erreurs.

je voudrais qu'en cas d'erreur le mail contienne aussi toutes les autres
notifications, même de niveau inférieur (info, debug, etc)

2/ dans un genre différent, je voudrais aussi envoyer un mail mais de façon
conditionelle, c'est à dire que suivant certaines conditions j'envoie un
mail ou non, et cette condition n'est absolument pas liée à un quelconque
niveau de notification, simplement je voudrais annuler l'envoi du mail final
si mon programme n'a effectué aucun traitement, par contre s'il a effectué
un traitement qu'il soit en erreur ou pas je veux envoyer le mail.

je ne vois pas trop comment faire, toute aide serait bienvenue :-)

j'ai pensé à utiliser le appender string par exemple et à la fin du
programme s'il y a eu une erreur ou pas j'envoi le contenu du buffer par
mail. mais c'est pas très élégant

Merci,
Papo

2 réponses

Avatar
Mark Clements
Papo wrote:
Bonjour à tous,

J'ai 2 problèmes que je cherche à résoudre avec log4perl, si quelqu'un a un
avis dessus ça serait très sympa de me tuyauter sur une solution:

1/ j'ai paramétré log4perl pour qu'il log tout dans un fichier et sur
l'écran et aussi pour qu'il m'envoie un mail mais uniquement en cas d'erreur
de l'appli (minlevel = error), ça marche mais évidement le mail ne contient
que les erreurs.

je voudrais qu'en cas d'erreur le mail contienne aussi toutes les autres
notifications, même de niveau inférieur (info, debug, etc)


quelque chose comme:

my $logger = Log::Log4perl->get_logger('somename.mailer');

if($error_flag && $logger->is_error()){
$logger->debug( .....



2/ dans un genre différent, je voudrais aussi envoyer un mail mais de façon
conditionelle, c'est à dire que suivant certaines conditions j'envoie un
mail ou non, et cette condition n'est absolument pas liée à un quelconque
niveau de notification, simplement je voudrais annuler l'envoi du mail final
si mon programme n'a effectué aucun traitement, par contre s'il a effectué
un traitement qu'il soit en erreur ou pas je veux envoyer le mail.


je ne vois pas trop comment faire, toute aide serait bienvenue :-)

j'ai pensé à utiliser le appender string par exemple et à la fin du
programme s'il y a eu une erreur ou pas j'envoi le contenu du buffer par
mail. mais c'est pas très élégant


Je pense que c'est ce que je ferais. Ce n'est pas toujours possible de
trouver une solution élégante :) Aussi, ce n'est pas la peine de passer
beaucoup de temps pour trouver un solution parfait, quand on a déjà une
solution qui marche.


my $mail_message = "";


$mail_message.= " étape1 ... . b";

..
..

$mail_message .= " étape2 .. ... . n";



if( $traitement_fait ) {
$logger->debug( $mail_message );

}



Mark

Avatar
Papo
merci pour ton avis.

alors finalement voilà ce que j'ai fait, j'ai réécrit le dispatcher mail,
j'ai ajouté 2 paramètres:

mail.send_level = 3

=> si un log level est >= à send_level j'envoie le mail à la fin, avec aussi
les les log des levels inférieurs jusqu'à min_level

mail.send_trigger = Envoi du mail

=> si un log contient la chaine send_trigger j'envoie le mail sans
conditions.

ça résoud mes 2 problèmes:

- en cas d'erreur j'ai bien un mail qui contient tous les log même debug, et
info si j'ai mis min_level = debug
- à la fin de mon traitement je peux envoyer le mail même sans erreurs en
faisant simplement un message qulconque qui contient la sous chaine
send_trigger:

$logger->info("Traitement terminé. Envoi du mail récapitulatif");

Pascal