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

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

在考虑了更多这些之后,我认为我需要澄清我希望完成的工作。我正在尝试从运行石英作业中捕获日志并将结果日志作为电子邮件发送。石英作业使许多服务方法调用到各种服务中。我希望包括那些服务方法执行的所有日志记录以及石英作业本身的日志记录。我当时想我可以执行以下操作来捕获所有日志记录,但是它不起作用。

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

参考方案

您不应使用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

注意:代码取自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");

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

java- log4j-找不到类 - java

我在Java Web应用程序中使用Log4j。现在,当我运行该Web应用程序的Servlet时,这是我收到的错误消息-描述服务器遇到内部错误(),导致服务器无法满足此请求。例外javax.servlet.ServletException: Servlet execution threw an exception root cause java.lang.No…

Log4j API中addAppender()方法中的问题 - java

嗨,我正在使用log4j api进行日志记录。当我使用以下代码追加到追加程序时,它显示“对于Logger类型未定义addAppender()”错误FileAppender myAppender = new FileAppender(new PatternLayout(),"output.log"); Logger.getLogger(Co…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…