Java 使用log4j通过SMTPAppender发送电子邮件报告
我试图使用log4j发送包含后台进程日志语句的可通过电子邮件发送的报告。我希望为每个进程运行发送一封电子邮件,而不是为每个日志记录语句发送一封电子邮件。我已经查看了Java 使用log4j通过SMTPAppender发送电子邮件报告,java,logging,log4j,Java,Logging,Log4j,我试图使用log4j发送包含后台进程日志语句的可通过电子邮件发送的报告。我希望为每个进程运行发送一封电子邮件,而不是为每个日志记录语句发送一封电子邮件。我已经查看了SMTPAppender,但没有看到在流程完成时手动发送报告的方法。我相信TriggeringEventEvaluator可能是关键,但我遇到的一个问题是如何获得TriggeringEventEvaluator实例的句柄。我一直在使用log4j1.2.14,而SMTPAppender.getEvaluator()方法是在1.2.15中
SMTPAppender
,但没有看到在流程完成时手动发送报告的方法。我相信TriggeringEventEvaluator
可能是关键,但我遇到的一个问题是如何获得TriggeringEventEvaluator
实例的句柄。我一直在使用log4j1.2.14,而SMTPAppender.getEvaluator()
方法是在1.2.15中引入的。有什么想法吗?我走对了吗?SMTPAppender.close()
方法在这里起作用了吗
我希望能够做到这一点:
log.info(message1);
log.info(message2);
log.info(message3);
log.sendMail();
在进一步思考这个问题之后,我想我需要澄清我希望实现的目标。我正在尝试捕获运行quartz作业的日志,并将结果日志作为电子邮件发送。quartz作业对各种服务进行一系列服务方法调用。我希望包括这些服务方法执行的任何日志记录以及quartz作业本身的日志记录。我想我可以做如下的事情来捕获所有日志记录,但它不起作用
// at the beginning of quartz job
Logger logger = Logger.getRootLogger();
StringWriter sw = new StringWriter();
WriterAppender wa = new WriterAppender(new SimpleLayout(), sw);
logger.addAppender(wa);
// at the end of the quartz job
String report = sw.toString();
您不应该使用log4j的任何方法,而是应该正确地配置它 首先,在
log4j.properties
文件中正确定义您的appender:
#CONFIGURE SMTP
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.SMTPHost=mail.mydomain.com
log4j.appender.email.SMTPUsername=myuser@mydomain.com
log4j.appender.email.SMTPPassword=mypw
log4j.appender.email.From=myuser@mydomain.com
log4j.appender.email.To=myuser@mydomain.com
log4j.appender.email.Subject=Log of messages
log4j.appender.email.BufferSize=1
log4j.appender.email.EvaluatorClass=TriggerLogEvent
log4j.appender.email.layout=org.apache.log4j.PatternLayout
log4j.appender.email.layout.ConversionPattern=%m
注意:代码取自。有关更多信息,请访问
接下来,制作一个专门用于发送电子邮件的类。例如:
package com.foo.mailer;
import org.apache.log4j.Logger;
public class Mailer {
private static final Logger logger = Logger.getLogger(Mailer.class);
public void logMail(String mailString) {
logger.info(mailString);
}
}
接下来,输入此类的log4j.properties
配置:
# INFO level will be logged
log4j.logger.com.foo.mailer = INFO, email
# turn off additivity
log4j.additivity.com.foo.mailer = false
现在,每当您想使用log4j发送电子邮件时,请在代码中输入以下内容:
new Mailer().logMail("This mail should be sent");
免责声明:我没有测试过任何代码 如果您使用的是XML配置文件,以下内容应该会有所帮助
<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender">
<param name="SMTPHost" value="mail.mydomain.com" />
<param name="SMTPUsername" value="myuser@mydomain.com" />
<param name="SMTPPassword" value="password" />
<param name="From" value="myuser@mydomain.com" />
<param name="To" value="myuser@mydomain.com" />
<param name="Subject" value="Log of messages" />
<param name="BufferSize" value="1" />
<param name="EvaluatorClass" value="TriggerLogEvent" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%t %m%n"/>
</layout>
</appender>
<logger name="com.foo.mailer">
<level value="INFO" />
<appender-ref ref="ErrorEmailAppender"/>
</logger>
Log4j 2.x以后,可以使用Log4j.xml的以下配置。它非常简单,可以用来发送电子邮件 您需要编辑它并输入您的smtp主机、用户名、密码、端口和主题
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<SMTP>
<name>Mail1</name>
<subject>SUBJECT</subject>
<to>TO_EMAIL</to>
<from>FROM_EMAIL</from>
<smtpHost>smtp.gmail.com</smtpHost>
<smtpPort>487</smtpPort>
<ignoreExceptions>false</ignoreExceptions>
<smtpUsername>username</smtpUsername>
<smtpPassword>password</smtpPassword>
<smtpProtocol>smtps</smtpProtocol>
<HtmlLayout charset="UTF-8" locationInfo="true" />
<ThresholdFilter level="ERROR"/>
</SMTP>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Mail1"/>
</Root>
</Loggers>
</Configuration>
在上述log4j属性中,我们可以发送电子邮件,仅获取信息声明。这意味着如果我有一些调试stmt,它将不会在电子邮件中包含这些语句,对吗?我不确定使用Mailer
类和logMail()
方法的方式是。。。这不会让运行软件的用户选择发送,也不会保证如果没有相应地配置log4j,这些日志消息将通过电子邮件发送。我看到更多的log4j方法(.debug(),.info(),…)是一个交付无关的系统,然后您可以使用log4j配置来执行筛选并选择适合您的交付方法(文件、电子邮件等)。可能会有所帮助