简体   繁体   English

如何使用 Log4J SMTPAppender 动态更改 email 主题?

[英]How can I dynamically change the email subject using Log4J SMTPAppender?

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

I am using the above mentioned log4j property file to send email when I do我正在使用上面提到的 log4j 属性文件来发送 email

log.error("Error message");

How do I be able to make it dynamic so that the message subject can change dynamically depending upon the machine name(env name).我如何能够使其动态化,以便消息主题可以根据机器名称(环境名称)动态变化。

eg:例如:

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

I want to use subjects 1,2 and 3 dynamically depending upon machine name.我想根据机器名称动态使用主题 1,2 和 3。

Any help will be appreciated.任何帮助将不胜感激。 Thanks谢谢

You should just need to make use of the hostname variable something like:您应该只需要使用主机名变量,例如:

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

Depending on your paritcular configuration and OS you may need to supply this variable to your JVM at statrup using -Dhostname='machinename' or -Dhostname=$HOST根据您的特定配置和操作系统,您可能需要使用 -Dhostname='machinename' 或 -Dhostname=$HOST 在 statrup 中将此变量提供给 JVM

In the following piece of code I read out the log4j.properties file, set the property log4j.appender.ERROREMAIL.Subject to emailRecipients and reset the log4j configuration.在下面的代码中,我读出了log4j.properties文件,设置属性log4j.appender.ERROREMAIL.Subject to emailRecipients并重置 Z2E025341F0D1BACE96DF1418767F9 配置。 Could be done at the start of the application, you just need to set the emailRecepients string right.可以在应用程序开始时完成,您只需正确设置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);

I can think of 2 solutions:我可以想到2个解决方案:

1) Write your own logger that will use SMTPAppender and set the properties programatically. 1) 编写您自己的记录器,该记录器将使用 SMTPAppender 并以编程方式设置属性。

2) Use the MDC to put a dynamic value in your code. 2) 使用MDC在代码中添加动态值。 You can get values from the MDC in your log4j.xml with the %X.您可以使用 %X 从 log4j.xml 中的 MDC 获取值。

ex: log4j.appender.ERROREMAIL.Subject=%X{key}例如:log4j.appender.ERROREMAIL.Subject=%X{key}

To set a username or over ENV variable设置用户名或 ENV 变量

log4j.appender.smtp.Subject=SYNC PROJECTS (${user.name}) Error Log ...
///////////////////////////////////////////////////////////////////////////
// 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");

    }
}

if we are reading the properties and adding the subject throw java code we will get concurrent request problem.如果我们正在读取属性并添加主题 throw java 代码,我们将遇到并发请求问题。

if first user modified the subject and doing some other operations before sending the mail.如果第一个用户在发送邮件之前修改了主题并进行了一些其他操作。 at the same time second user added different subject.同时第二个用户添加了不同的主题。 first user is also get the second user's subject.第一个用户也得到了第二个用户的主题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM