2011-08-10 8 views
9
log4j.appender.ERROREMAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.ERROREMAIL.SMTPHost=www.company.com 
log4j.appender.ERROREMAIL.Threshold=ERROR 
[email protected],[email protected],[email protected] 
log4j.appender.ERROREMAIL.From=some.emailaddress.com 
log4j.appender.ERROREMAIL.Subject=messagesubject1 

estoy usando el mencionado archivo de propiedades log4j para enviar correo electrónico cuando lo haga¿Cómo puedo cambiar dinámicamente el asunto del correo electrónico utilizando Log4J SMTPAppender?

log.error("Error message"); 

¿cómo ser capaz de hacerlo dinámico para que el asunto del mensaje puede cambiar dinámicamente dependiendo de la máquina nombre (nombre env)

por ejemplo:

log4j.appender.ERROREMAIL.Subject=messagesubject1, messagesubject2, messagesubject3 

Quiero usar sujetos 1,2 y 3 en función dinámicamente a nombre de la máquina.

Cualquier ayuda será apreciada. Gracias

Respuesta

2

en el siguiente fragmento de código que he leído los log4j.properties file, configure la propiedad log4j.appender.ERROREMAIL.Subject to emailRecipients y restablezca la configuración de log4j. Podría hacerse al inicio de la aplicación, solo necesita configurar la cadena emailRecepients derecha.

Properties props = new Properties(); 
    try { 
     InputStream configStream = Thread.class.getResourceAsStream("/log4j.properties"); 
     if (configStream == null) { 
      throw new RuntimeException(); 
     } 
     props.load(configStream); 
     configStream.close(); 
    } catch(Throwable e) { 
     System.out.println("Error: Cannot load log4j configuration file "); 
    } 

    props.setProperty("log4j.appender.ERROREMAIL.Subject", emailRecipients); 

    LogManager.resetConfiguration(); 
    PropertyConfigurator.configure(props); 
+1

¿Qué pasa con el mensaje que se genera dinámicamente dentro del código? Quiero capturar eso. Hay alguna manera. – user234194

1

se me ocurren 2 soluciones:

1) Escribir registrador que utilizará SMTPAppender y establecer las propiedades mediante programación.

2) Use MDC para poner un valor dinámico en su código. Puede obtener valores del MDC en su log4j.xml con% X.

ejemplo: log4j.appender.ERROREMAIL.Subject =% X {clave}

+0

Estoy trabajando en su sugerencia no. 1. Pude cambiar de tema, pero ¿cómo configuro el mensaje? ¿Puedo tener algún enlace o ejemplos? – user234194

+0

Mi impresión fue que cuando llamas a logger.error ("este es mi error") la cadena "Este es mi error" aparecerá en el contenido del mensaje. Después de reflexionar, la solución 2 sería más fácil ya que no tienes que codificar nada. ¿Es su aplicación una aplicación web o una aplicación independiente? – Cygnusx1

+0

es independiente. – user234194

4

Sólo debería tener que hacer uso de la variable de nombre de host algo como:

log4j.appender.ERROREMAIL.Subject=${hostname} 

Dependiendo de la configuración paritcular y el sistema operativo puede que tenga que suministrar esta variable para la JVM en statrup usando -Dhostname = 'machinename' o -Dhostname = $ HOST

1

Para establecer un nombre de usuario o durante variable ENV

log4j.appender.smtp.Subject=SYNC PROJECTS (${user.name}) Error Log ... 
0
/////////////////////////////////////////////////////////////////////////// 
// Initial Logging configuration 
/////////////////////////////////////////////////////////////////////////// 

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 


    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n"/> 
     </layout> 
    </appender> 


    <!-- BufferSize almacena un buffer de mensajes. Un evento de tipo error o 
    superior provoca el envio del correo junto con el resto de mensajes en el buffer (si los hay) --> 
    <appender name="emailAppender" class="org.apache.log4j.net.SMTPAppender"> 

     <param name="BufferSize" value="40"/> 
     <param name="SMTPHost"  value="conectores.mydomain.es" /> 
     <param name="SMTPUsername" value="weblogic" />   
     <param name="From"   value="[email protected]" /> 
     <param name="To"   value="[email protected]" /> 
     <param name="Subject"  value="Notificación de la aplicación" /> 

     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%n%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%l] %n%m%n" /> 
     </layout> 
    </appender> 

    <!-- Las trazas de nivel trace o superior las mete en el buffer, el resto las desecha --> 
    <logger name="smtp.logger"> 
     <level value="debug"/> 
     <appender-ref ref="emailAppender" /> 
    </logger> 

    <root> 
     <priority value="debug"/> 
     <appender-ref ref="consoleAppender"/> 
    </root> 

</log4j:configuration> 

/////////////////////////////////////////////////////////////////////////// 
// Dynamic configuration of SMTAppender attributes 
/////////////////////////////////////////////////////////////////////////// 

package es.foo.test; 

import java.util.Enumeration; 

import java.util.Properties; 

import org.apache.log4j.Appender; 
import org.apache.log4j.Logger; 
import org.apache.log4j.net.SMTPAppender; 

public class TestSMTPAppender { 

    private static Logger smtp = Logger.getLogger("smtp.logger"); 
    private static boolean ini_flag = false;  
    private static final Properties propiedades = new Properties(); 
    static { 
     try {   
      propiedades.load(TestSMTPAppender.class.getClassLoader().getResourceAsStream("mydomainUtiles.properties")); 
     } catch (Exception ioe) { 
      System.err.println("error while creating properties from 'mydomainUtiles.properties': " + ioe.getMessage());  
     } 
    } 

    private static void initializeLogger(){ 

     String SMTPHost = propiedades.getProperty("host"); 
     String SMTPUsername = propiedades.getProperty("user"); 
     String From = propiedades.getProperty("sender"); 

     Enumeration eappenders = smtp.getAllAppenders(); 
     while(eappenders.hasMoreElements()){ 
      Appender appender = (Appender) eappenders.nextElement(); 
      if(appender instanceof SMTPAppender){ 

       if(SMTPHost != null){ 
        ((SMTPAppender)appender).setSMTPHost(SMTPHost); 
       } 

       if(SMTPUsername != null){ 
        ((SMTPAppender)appender).setSMTPUsername(SMTPUsername); 
       } 

       if(From != null){ 
        ((SMTPAppender)appender).setFrom(From); 
       } 

       // Place here other attributes, like Subject 

       ((SMTPAppender)appender).activateOptions(); 
      }   
     } 
    } 

    public static Logger getSMTPLogger(){ 
     if(!ini_flag){ 
      initializeLogger(); 
      ini_flag = true;   
     } 
     return TestSMTPAppender.smtp; 
    } 

} 

/////////////////////////////////////////////////////////////////////////// 
// TEST 
/////////////////////////////////////////////////////////////////////////// 

package es.foo.test; 

import java.util.Enumeration; 

import org.apache.log4j.Appender; 
import org.apache.log4j.Logger; 
import org.apache.log4j.net.SMTPAppender; 

public class Test { 

    private static Logger smtp = TestSMTPAppender.getSMTPLogger(); 

    public static void main(String[] args) { 

     smtp.trace("message1"); 
     smtp.debug("message2"); 
     smtp.info("message3"); 
     smtp.warn("message4"); 
     smtp.error("message5"); 

    } 
} 
0

si estamos leyendo las propiedades y añadiendo el código java tiro sujeto obtendremos un problema de solicitudes simultáneas.

si el primer usuario modificó el asunto y realizó algunas otras operaciones antes de enviar el correo. al mismo tiempo, el segundo usuario agregó un tema diferente. el primer usuario también obtiene el tema del segundo usuario.

Cuestiones relacionadas