2010-11-29 16 views
9

J'essaie d'utiliser log4j pour envoyer des rapports disponibles contenant les instructions de journalisation à partir d'un processus en arrière-plan. Je souhaite recevoir un e-mail pour chaque exécution de processus, et non un e-mail pour chaque instruction de journalisation. J'ai regardé le SMTPAppender, mais ne vois pas un moyen d'envoyer le rapport manuellement lorsque le processus se termine. Je crois que le TriggeringEventEvaluator peut être la clé, mais un problème que je rencontre est de savoir comment obtenir un handle à l'instance TriggeringEventEvaluator. Je suis coincé en utilisant log4j 1.2.14 et la méthode SMTPAppender.getEvaluator() a été introduite en 1.2.15. Des pensées? Suis-je même sur la bonne voie? Est-ce que la méthode SMTPAppender.close() entre en jeu ici?Utilisation de log4j pour envoyer des rapports de courrier électronique via le SMTPAppender

Je veux être en mesure de le faire:

log.info(message1); 
log.info(message2); 
log.info(message3); 
log.sendMail(); 

Après avoir réfléchi à ce un peu plus, je pense que je dois préciser que j'espère accomplir. J'essaye de capturer la notation d'exécuter un travail de quartz et d'envoyer le journal résultant comme email. Le travail à quartz fait un tas d'appels de méthode de service dans divers services. Je veux que les méthodes de service soient consignées, ainsi que la journalisation des travaux de quartz. Je pensais que je pourrais faire quelque chose comme ce qui suit pour capturer toute la journalisation, mais cela ne fonctionne pas.

// at the beginning of quartz job 
Logger logger = Logger.getRootLogger(); 
StringWriter sw = new StringWriter(); 
WriterAppender wa = new WriterAppender(new SimpleLayout(), sw); 
logger.addAppender(wa); 

// at the end of the quartz job 
String report = sw.toString(); 
+0

probablement [ce poste] (http://stackoverflow.com/a/42435452/1902296) peut être utile – gumkins

Répondre

16

Vous ne devriez utiliser aucune des méthodes de log4j, vous devriez le configurer correctement.

Tout d'abord, définie dans le fichier log4j.properties votre appender correctement:

#CONFIGURE SMTP 
log4j.appender.email=org.apache.log4j.net.SMTPAppender 
log4j.appender.email.SMTPHost=mail.mydomain.com 
[email protected] 
log4j.appender.email.SMTPPassword=mypw 
[email protected] 
[email protected] 
log4j.appender.email.Subject=Log of messages 
log4j.appender.email.BufferSize=1 
log4j.appender.email.EvaluatorClass=TriggerLogEvent 
log4j.appender.email.layout=org.apache.log4j.PatternLayout 
log4j.appender.email.layout.ConversionPattern=%m 

Note: le code de prise this post. Plus d'informations peuvent être obtenues en SMTPAppender API.

Ensuite, créez une classe spéciale qui sera utilisée uniquement pour l'envoi d'e-mails. Exemple:

package com.foo.mailer; 
import org.apache.log4j.Logger; 

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

    public void logMail(String mailString) { 
     logger.info(mailString); 
    } 
} 

Ensuite, mettre en log4j.properties configuration pour cette classe:

# INFO level will be logged 
log4j.logger.com.foo.mailer = INFO, email 
# turn off additivity 
log4j.additivity.com.foo.mailer = false 

Maintenant, chaque fois que vous voulez envoyer un e-mail en utilisant log4j, mettez dans votre code:

new Mailer().logMail("This mail should be sent"); 

Clause de non-responsabilité: Je n'ai testé aucun de ces codes.

+0

dans les propriétés log4j ci-dessus, nous pouvons envoyer e-mail pour les instructions INFO seulement que droit. cela signifie que si j'ai des debug stmts, cela n'inclura pas ces instructions dans l'e-mail, n'est-ce pas? – mahesh

+1

Je ne suis pas sûr que l'utilisation d'une classe 'Mailer' avec une méthode' logMail() 'est la façon ... Cela ne laisse pas le choix de la livraison à l'utilisateur qui exécute le logiciel, ni le logiciel ont une garantie que ces les messages de log seront livrés par email si log4j n'est pas configuré en conséquence. Je vois plus de méthodes log4j (.debug(), .info(), ...) comme un système de livraison-agnostique, alors vous utilisez la configuration de log4j pour effectuer un filtrage et choisir votre méthode de livraison (fichier, email, ...) qui vous convient. – Julien

3

Si vous utilisez un fichier de configuration XML, les éléments suivants devraient vous être utiles.

<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender"> 
    <param name="SMTPHost" value="mail.mydomain.com" /> 
    <param name="SMTPUsername" value="[email protected]" /> 
    <param name="SMTPPassword" value="password" /> 
    <param name="From" value="[email protected]" /> 
    <param name="To" value="[email protected]" /> 
    <param name="Subject" value="Log of messages" /> 
    <param name="BufferSize" value="1" /> 
    <param name="EvaluatorClass" value="TriggerLogEvent" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%t %m%n"/> 
    </layout> 
</appender> 

<logger name="com.foo.mailer"> 
    <level value="INFO" /> 
    <appender-ref ref="ErrorEmailAppender"/> 
</logger>