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。
任何帮助将不胜感激。 感谢
答案 0 :(得分:5)
您应该只需要使用hostname变量:
log4j.appender.ERROREMAIL.Subject=${hostname}
根据您的paritcular配置和操作系统,您可能需要使用-Dhostname ='machinename'或-Dhostname = $ HOST
将此变量提供给statrup的JVM答案 1 :(得分: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);
答案 2 :(得分:1)
我可以想到2个解决方案:
1)编写自己的记录器,使用SMTPAppender并以编程方式设置属性。
2)使用MDC在代码中添加动态值。您可以使用%X从log4j.xml中的MDC获取值。
例如: log4j.appender.ERROREMAIL.Subject =%X {键}
答案 3 :(得分:1)
设置用户名或ENV变量
log4j.appender.smtp.Subject=SYNC PROJECTS (${user.name}) Error Log ...
答案 4 :(得分: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="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 :(得分:0)
如果我们正在阅读属性并添加主题抛出java代码,我们将得到并发请求问题。
如果第一个用户在发送邮件之前修改了主题并执行了其他操作。同时第二个用户添加了不同的主题。第一个用户也获得第二个用户的主题。