简体   繁体   English

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

[英]Using log4j to send email reports via the SMTPAppender

I'm trying to use log4j to send emailable reports that contain the logging statements from a background process. 我正在尝试使用log4j发送包含来自后台进程的日志记录语句的可通过电子邮件发送的报告。 I want one email sent for each process run, not one email for each logging statement. 我想为每个进程运行发送一封电子邮件,而不是每封邮件语句都有一封电子邮件。 I've looked at the SMTPAppender , but don't see a way to manually send the report when the process completes. 我查看了SMTPAppender ,但是在进程完成时没有看到手动发送报告的方法。 I believe the TriggeringEventEvaluator may be the key, but one issue I'm running into is how to get a handle to the TriggeringEventEvaluator instance. 我相信TriggeringEventEvaluator可能是关键,但我遇到的一个问题是如何获取TriggeringEventEvaluator实例的句柄。 I'm stuck using log4j 1.2.14 and the SMTPAppender.getEvaluator() method was introduced in 1.2.15. 我坚持使用log4j 1.2.14并且在1.2.15中引入了SMTPAppender.getEvaluator()方法。 Any thoughts? 有什么想法吗? Am I even on the right track? 我是否走在正确的轨道上? Does the SMTPAppender.close() method come into play here? SMTPAppender.close()方法是否在这里发挥作用?

I want to be able to do this: 我希望能够这样做:

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

After thinking about this some more, I think I need to clarify what I'm hoping to accomplish. 在考虑了这个之后,我想我需要澄清一下我希望完成的事情。 I'm trying to capture the logging from running a quartz job and send the resulting log as an email. 我正在尝试捕获运行石英作业的日志记录,并将生成的日志作为电子邮件发送。 The quartz job makes a bunch of service method calls into various services. quartz工作将一堆服务方法调用到各种服务中。 I want the to include any logging those service methods perform as well as the logging of the quartz jobs itself. 我想要包括那些服务方法执行的任何日志记录以及石英作业本身的日志记录。 I was thinking I could do something like the following for capturing all the logging, but it isn't working. 我以为我可以执行类似以下操作来捕获所有日志记录,但它无法正常工作。

// 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();

You shouldn't use any of log4j's methods, you should configure it properly instead. 您不应该使用任何log4j的方法,而应该正确配置它。

First of all, define in your log4j.properties file your appender properly: 首先,在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

Note: code taken from this post . 注意:从这篇文章中获取的代码。 More information can be obtained in SMTPAppender API . 可以在SMTPAppender API中获取更多信息。

Next, make a special class that will be used just for sending email. 接下来,创建一个专门用于发送电子邮件的类。 Example: 例:

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

Next, put in log4j.properties configuration for this class: 接下来,为此类添加log4j.properties配置:

# INFO level will be logged
log4j.logger.com.foo.mailer = INFO, email
# turn off additivity
log4j.additivity.com.foo.mailer = false

Now, whenever you want to send an email using log4j, put this in your code: 现在,每当您想使用log4j发送电子邮件时,请将其放入您的代码中:

new Mailer().logMail("This mail should be sent");

Disclaimer : I haven't tested any of this code. 免责声明 :我没有测试过任何此类代码。

If you are using an XML configuration file, the following should be helpful. 如果您使用的是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 onwards, the following configuration for log4j.xml can be used. Log4j 2.x以后,可以使用log4j.xml的以下配置。 It's pretty straightforward and can be used to send emails. 它非常简单,可用于发送电子邮件。

You need to edit it and enter your smtp host, username, password, port and subject. 您需要编辑它并输入您的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>

Reference: Log4j SMTP Appender 参考: Log4j SMTP Appender

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

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