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

发布于 2024-10-04 14:42:28 字数 937 浏览 1 评论 0原文

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

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 TriggeringEventEvaluator may be the key, but one issue I'm running into is how to get a handle to the TriggeringEventEvaluator instance. 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?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

百合的盛世恋 2024-10-11 14:42:28

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

首先,在您的 log4j.properties 文件中正确定义您的附加程序:

#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

注意:代码取自 这篇文章。更多信息可以在 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");

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

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

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

#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.

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:

# 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:

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

Disclaimer: I haven't tested any of this code.

悲凉≈ 2024-10-11 14:42:28

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

If you are using an XML configuration file, the following should be helpful.

<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>
一身骄傲 2024-10-11 14:42:28

从 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

Log4j 2.x onwards, the following configuration for log4j.xml can be used. 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.

<?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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文