【问题标题】:How can I dynamically change the email subject using Log4J SMTPAppender?如何使用 Log4J SMTPAppender 动态更改电子邮件主题?
【发布时间】:2011-10-24 07:04:07
【问题描述】:
log4j.appender.ERROREMAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.ERROREMAIL.SMTPHost=www.company.com
log4j.appender.ERROREMAIL.Threshold=ERROR
log4j.appender.ERROREMAIL.To=email.address1@company.com,email.address2@company.com,email.address3@company.com
log4j.appender.ERROREMAIL.From=some.emailaddress.com
log4j.appender.ERROREMAIL.Subject=messagesubject1

我正在使用上面提到的 log4j 属性文件来发送 当我这样做时发送电子邮件

log.error("Error message");

我怎样才能使它动态化,以便 消息主题可以根据机器名称(环境名称)动态变化。

例如:

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

我想根据机器名称动态使用主题 1,2 和 3。

任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    您应该只需要使用主机名变量,例如:

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

    根据您的特定配置和操作系统,您可能需要使用 -Dhostname='machinename' 或 -Dhostname=$HOST 在 statrup 中将此变量提供给 JVM

    【讨论】:

      【解决方案2】:

      在下面的代码中,我读出了 log4j.properties 文件,将属性 log4j.appender.ERROREMAIL.Subject 设置为 emailRecipients 并重置 log4j 配置。可以在应用程序开始时完成,您只需要正确设置 emailRecepients 字符串。

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

      【讨论】:

      • 在代码中动态生成的消息怎么样。我想捕获它。有没有办法。
      【解决方案3】:

      设置用户名或 ENV 变量

      log4j.appender.smtp.Subject=SYNC PROJECTS (${user.name}) Error Log ...
      

      【讨论】:

        【解决方案4】:
        ///////////////////////////////////////////////////////////////////////////
        // 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="no.reply@mydomain.es" />  
                <param name="To"            value="foo.bar@externos-mydomain.es" />  
                <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");
        
            }
        }
        

        【讨论】:

          【解决方案5】:

          我能想到 2 个解决方案:

          1. 编写您自己的记录器,该记录器将使用 SMTPAppender 并以编程方式设置属性。

          2. 使用MDC 在代码中添加动态值。您可以使用 %X 在 log4j.xml 中从 MDC 获取值。

          例如:

          log4j.appender.ERROREMAIL.Subject=%X{key}
          

          【讨论】:

          • 我正在处理您的建议。 1. 我可以更改主题,但如何设置消息。我可以有一些链接或示例。
          • 我的印象是,当您调用 logger.error("this is my error") 时,字符串“This is my error”会出现在消息内容中!经过一番思考,解决方案 2 会更容易,因为您不必编写任何代码。您的应用是 Web 应用还是独立应用?
          【解决方案6】:

          如果我们正在读取属性并添加主题 throw java 代码,我们将遇到并发请求问题。

          如果第一个用户在发送邮件之前修改了主题并进行了一些其他操作。同时第二个用户添加了不同的主题。第一个用户也得到了第二个用户的主题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-14
            • 1970-01-01
            相关资源
            最近更新 更多