Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用log4j通过SMTPAppender发送电子邮件报告_Java_Logging_Log4j - Fatal编程技术网

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

Java 使用log4j通过SMTPAppender发送电子邮件报告,java,logging,log4j,Java,Logging,Log4j,我试图使用log4j发送包含后台进程日志语句的可通过电子邮件发送的报告。我希望为每个进程运行发送一封电子邮件,而不是为每个日志记录语句发送一封电子邮件。我已经查看了SMTPAppender,但没有看到在流程完成时手动发送报告的方法。我相信TriggeringEventEvaluator可能是关键,但我遇到的一个问题是如何获得TriggeringEventEvaluator实例的句柄。我一直在使用log4j1.2.14,而SMTPAppender.getEvaluator()方法是在1.2.15中

我试图使用log4j发送包含后台进程日志语句的可通过电子邮件发送的报告。我希望为每个进程运行发送一封电子邮件,而不是为每个日志记录语句发送一封电子邮件。我已经查看了
SMTPAppender
,但没有看到在流程完成时手动发送报告的方法。我相信
TriggeringEventEvaluator
可能是关键,但我遇到的一个问题是如何获得
TriggeringEventEvaluator
实例的句柄。我一直在使用log4j1.2.14,而
SMTPAppender.getEvaluator()
方法是在1.2.15中引入的。有什么想法吗?我走对了吗?
SMTPAppender.close()
方法在这里起作用了吗

我希望能够做到这一点:

log.info(message1);
log.info(message2);
log.info(message3);
log.sendMail();
在进一步思考这个问题之后,我想我需要澄清我希望实现的目标。我正在尝试捕获运行quartz作业的日志,并将结果日志作为电子邮件发送。quartz作业对各种服务进行一系列服务方法调用。我希望包括这些服务方法执行的任何日志记录以及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();

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

首先,在
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
注意:代码取自。有关更多信息,请访问

接下来,制作一个专门用于发送电子邮件的类。例如:

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

免责声明:我没有测试过任何代码

如果您使用的是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以后,可以使用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属性中,我们可以发送电子邮件,仅获取信息声明。这意味着如果我有一些调试stmt,它将不会在电子邮件中包含这些语句,对吗?我不确定使用
Mailer
类和
logMail()
方法的方式是。。。这不会让运行软件的用户选择发送,也不会保证如果没有相应地配置log4j,这些日志消息将通过电子邮件发送。我看到更多的log4j方法(.debug(),.info(),…)是一个交付无关的系统,然后您可以使用log4j配置来执行筛选并选择适合您的交付方法(文件、电子邮件等)。可能会有所帮助