如何使用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 

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

 log.error("Error message"); 

如何使其成为动态的,以便消息主题可以根据计算机名称(env名称)动态更改。

例如:

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

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

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

在下面的代码中,我读出了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); 

您应该只需要使用hostname变量,例如:

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

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

我能想到2个解决方案:

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

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

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

设置用户名或ENV变量

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

如果我们正在阅读属性并添加主题抛出java代码,我们将得到并发请求问题。

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