2010-11-29 19 views
9

Estoy tratando de usar log4j para enviar informes disponibles que contengan las instrucciones de registro de un proceso en segundo plano. Quiero que se envíe un correo electrónico para cada proceso, no un correo electrónico para cada declaración de registro. Miré SMTPAppender, pero no veo una forma de enviar manualmente el informe cuando finaliza el proceso. Creo que el TriggeringEventEvaluator puede ser la clave, pero un problema al que me estoy enfrentando es cómo obtener un control para la instancia TriggeringEventEvaluator. Estoy atascado usando log4j 1.2.14 y el método SMTPAppender.getEvaluator() fue introducido en 1.2.15. ¿Alguna idea? ¿Estoy incluso en el camino correcto? ¿El método SMTPAppender.close() entra en juego aquí?Uso de log4j para enviar informes por correo electrónico a través del agente SMTPAppender

Quiero ser capaz de hacer esto:

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

Después de pensar en esta un poco más, creo que es necesario aclarar lo que espero lograr. Estoy tratando de capturar el registro ejecutando un trabajo de cuarzo y enviar el registro resultante como un correo electrónico. El trabajo de cuarzo hace un montón de llamadas al método de servicio en varios servicios. Quiero que incluya cualquier registro que realicen esos métodos de servicio, así como el registro de los trabajos de cuarzo en sí. Estaba pensando que podría hacer algo como lo siguiente para capturar todo el registro, pero no está funcionando.

// 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

Probablemente [este mensaje] (http://stackoverflow.com/a/42435452/1902296) puede ser útil en – gumkins

Respuesta

16

No debe utilizar ninguno de los métodos de log4j, en su lugar debe configurarlo correctamente.

En primer lugar, define en su log4j.properties presentar su appender correctamente:

#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 

Nota: El código tomado de this post. Se puede obtener más información en SMTPAppender API.

A continuación, haga una clase especial que se utilizará solo para enviar correos electrónicos. Ejemplo:

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); 
    } 
} 

A continuación, poner en la configuración log4j.properties para esta clase:

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

Ahora, cada vez que desee enviar un correo electrónico utilizando log4j, poner esto en su código:

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

Descargo de responsabilidad: No he probado nada de este código.

+0

propiedades log4j anteriores, podemos enviar correo electrónico sólo para declaraciones INFO único derecho. Significa que si tengo algunas reglas de depuración, no incluirá esas declaraciones en el correo electrónico ¿verdad? – mahesh

+1

No estoy seguro de que el uso de una clase 'Mailer' con un método' logMail() 'sea la forma ... Esto no deja la opción de entrega al usuario que ejecuta el software, ni el software tiene una garantía de que estos los mensajes de registro se enviarán por correo electrónico si log4j no está configurado en consecuencia. Veo más métodos de log4j (.debug(), .info(), ...) como un sistema independiente de la entrega, luego usas la configuración de log4j para realizar un filtrado y elegir tu método de entrega (archivo, correo electrónico, ...) que te convenga – Julien

3

Si está utilizando un archivo de configuración XML, lo siguiente debería ser útil.

<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> 
Cuestiones relacionadas