Log4j smtp appender只发送一封电子邮件用于所有错误

时间:2015-10-22 17:04:47

标签: java log4j smtpappender

我有一个处理ID的程序。有些ID会在ETL上出现多个错误。 我正在设置log4j smtp以在遇到错误或致命时发送电子邮件。 现在,它将发送5封电子邮件,用于一次程序运行的五个错误。我想将它们汇总成一封电子邮件。我有log4j属性设置而不是xml。

性质。我躲到了

log4j.rootCategory=DEBUG,stdout,fileout, sendMail

log4j.appender.sendMail=org.apache.log4j.net.SMTPAppender
log4j.appender.sendMail.Threshold=Error
log4j.appender.sendMail.SMTPHost=mailhost
log4j.appender.sendMail.From=hidden
log4j.appender.sendMail.To=hidden
log4j.appender.sendMail.Subject=Failure
log4j.appender.sendMail.BufferSize=1
#log4j.appender.sendMail.evaluatorClass=TriggerLogEvent
log4j.appender.sendMail.layout=org.apache.log4j.PatternLayout
log4j.appender.sendMail.layout.ConversionPattern=%m

Theres在log4j smtp appender上的信息不多。

1 个答案:

答案 0 :(得分:1)

如何创建另一个类来聚合错误消息并为该类创建一个新的记录器

所以首先要创建一个类,它将保存特定id的所有错误消息

public class TestLog4j {

static Logger log = Logger.getLogger(TestLog4j.class.getName());

int id;
ArrayList<String> errors,fatals;

public void addError(String e)
{

    this.errors.add(e);
}
public void addFatal(String f)
{

    this.fatals.add(f);
}

public void sendLogs() {

    SimpleDateFormat sdf = new SimpleDateFormat();

    for (String e : this.errors)
    {
         log.error("Error Message at "+sdf.format(new Date()) + " for id "+ this.id);
    }
    for (String f : this.fatals)
    {
          log.fatal("Fatal Message at "+sdf.format(new Date()) + " for id "+ this.id);
    }


    }

}

现在,只有在确定已经聚合了消息之后,才调用sendLogs方法。 同样在你的log4j.properties中,你可以为这个TestLog4j类添加另一个smtpappender。你可以明显地优化代码

<强> log4j.properties

log4j.logger.package.TestLog4j = ERROR, sendmail
# turn off additivity
log4j.additivity.package.TestLog4j = false