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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4306212/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 15:41:00  来源:igfitidea点击:

Using log4j to send email reports via the SMTPAppender

javalogginglog4j

提问by fmpdmb

I'm trying to use log4j to send emailable reports that contain the logging statements from a background process. 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. I believe the TriggeringEventEvaluatormay be the key, but one issue I'm running into is how to get a handle to the TriggeringEventEvaluatorinstance. I'm stuck using log4j 1.2.14 and the SMTPAppender.getEvaluator()method was introduced in 1.2.15. Any thoughts? Am I even on the right track? Does the SMTPAppender.close()method come into play here?

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

回答by darioo

You shouldn't use any of log4j's methods, you should configure it properly instead.

你不应该使用任何 log4j 的方法,你应该正确地配置它。

First of all, define in your log4j.propertiesfile your appender properly:

首先,在您的log4j.properties文件中正确定义您的 appender:

#CONFIGURE SMTP
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.SMTPHost=mail.mydomain.com
[email protected]
log4j.appender.email.SMTPPassword=mypw
[email protected]
[email protected]
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.propertiesconfiguration 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.

免责声明:我尚未测试任何此代码。

回答by Drew Noakes

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="[email protected]" />
    <param name="SMTPPassword" value="password" />
    <param name="From" value="[email protected]" />
    <param name="To" value="[email protected]" />
    <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>

回答by Zoinks

Log4j 2.x onwards, the following configuration for log4j.xml can be used. It's pretty straightforward and can be used to send emails.

从 Log4j 2.x 开始,可以使用 log4j.xml 的以下配置。它非常简单,可用于发送电子邮件。

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