【问题标题】:Using log4j to send email reports via the SMTPAppender使用 log4j 通过 SMTPAppender 发送电子邮件报告
【发布时间】:2010-11-29 17:19:17
【问题描述】:

我正在尝试使用 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();

在考虑了更多之后,我认为我需要澄清我希望实现的目标。我正在尝试从运行石英作业中捕获日志并将生成的日志作为电子邮件发送。石英作业将一堆服务方法调用到各种服务中。我希望包含这些服务方法执行的任何日志记录以及石英作业本身的日志记录。我在想我可以执行以下操作来捕获所有日志记录,但它不起作用。

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

【问题讨论】:

标签: java logging log4j


【解决方案1】:

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

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

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

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

【讨论】:

  • 在上面的 log4j 属性中,我们只能为 INFO 语句发送电子邮件。这意味着如果我有一些调试 stmts,它不会在电子邮件中包含这些语句吗?
  • 我不确定使用Mailer 类和logMail() 方法是否是正确的方法...这不会将交付的选择留给运行软件的用户,也不会留给软件如果未相应配置 log4j,则保证这些日志消息将通过电子邮件传递。我看到更多 log4j 方法(.debug()、.info()、...)作为与交付无关的系统,然后您使用 log4j 配置执行过滤并选择您的交付方法(文件、电子邮件、... ) 适合你。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多