Logback - 需要发送一封电子邮件而不是多封电子邮件

时间:2018-02-09 13:26:16

标签: java logback

我使用的是logback 1.2.3版。我在我的logback xml配置文件中配置了SMTPAppender,如下所示:

<appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>warn</level>
    </filter>
    <smtpHost>smtp.mydomain.org</smtpHost>
    <to>code4kix@mydomain.org</to>
    <from>do-not-reply@mydomain.org</from>
    <subject>${HOSTNAME} | %-5level: %logger{20}</subject>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
    </layout>
    <asynchronousSending>false</asynchronousSending>
</appender>

如果我有类似下面的Java类,它会向我发送两封单独的电子邮件。我需要他们在一封电子邮件中。怎么样?

logger.error("statement 1");
logger.error("statement 2");

请注意,将以下内容添加到logback配置无济于事。我错过了什么?

<STARTTLS>true</STARTTLS>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
    <bufferSize>10</bufferSize>
</cyclicBufferTracker>
<asynchronousSending>false</asynchronousSending>

1 个答案:

答案 0 :(得分:0)

我忘了更新答案。我很快意识到,从logback的角度来看,它并不是那么直截了当。如何知道何时触发电子邮件?如果在这些之后还有另一个logger.error("statement 3");,然后电子邮件应该出去怎么办:

logger.error("statement 1");
logger.error("statement 2");

我们需要明确告诉logback何时触发电子邮件。阅读有关标记的更多here

因此,您需要在结尾处使用类似记录器语句的内容来标记电子邮件何时触发:

logger.info(SMTP_TRIGGER, "statement last");

而且,您需要将您的logback配置更新为:

<appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>warn</level>
    </filter>
    <smtpHost>smtp.mydomain.org</smtpHost>
    <to>code4kix@mydomain.org</to>
    <from>do-not-reply@mydomain.org</from>
    <subject>${HOSTNAME} | %-5level: %logger{20}</subject>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
    </layout>
    <asynchronousSending>false</asynchronousSending>

    <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
      <expression>
        marker != null  && marker.contains("SMTP_TRIGGER")
      </expression>
    </evaluator>
 </appender>