使用log4j通过SMTPAppender发送电子邮件报告

时间:2010-11-29 17:19:17

标签: java logging log4j

我正在尝试使用log4j发送包含来自后台进程的日志记录语句的可通过电子邮件发送的报告。我想为每个进程运行发送一封电子邮件,而不是每封邮件语句都有一封电子邮件。我查看了SMTPAppender,但在流程完成时看不到手动发送报告的方法。我相信TriggeringEventEvaluator可能是关键,但我遇到的一个问题是如何获取TriggeringEventEvaluator实例的句柄。我坚持使用log4j 1.2.14并在1.2.15中引入SMTPAppender.getEvaluator()方法。有什么想法吗?我是否走在正确的轨道上? SMTPAppender.close()方法在这里发挥作用吗?

我希望能够做到这一点:

log.info(message1);
log.info(message2);
log.info(message3);
log.sendMail();

在考虑了这个之后,我想我需要澄清一下我希望完成的事情。我正在尝试捕获运行石英作业的日志记录,并将生成的日志作为电子邮件发送。 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();

3 个答案:

答案 0 :(得分:17)

你不应该使用任何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

注意:代码取自this post。可以在SMTPAppender API中获取更多信息。

接下来,制作一个专门用于发送电子邮件的课程。例如:

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

免责声明:我还没有测试过这些代码。

答案 1 :(得分:3)

如果您使用的是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>

答案 2 :(得分:0)

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 SMTP Appender