【问题标题】:Why is Logback SMTPAppender only sending 1 email?为什么 Logback SMTPAppender 只发送 1 封电子邮件?
【发布时间】:2013-05-30 02:32:55
【问题描述】:

这是一个包含我的 Logback SMTPAppender 的 sn-p:

<appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>NEUTRAL</onMismatch>
    </filter>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

    <asynchronousSending>false</asynchronousSending>

    <smtpHost>my.smtp.host</smtpHost>
    <to>john.smith@example.com</to>
    <from>no-reply@example.com</from>
    <username>my_smtp_user</username>
    <password>my_smtp_password</password>
    <subject>%logger{20} - %m</subject>
    <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
        <bufferSize>1</bufferSize>
    </cyclicBufferTracker>
</appender>

当以下 Java 执行时:

logger.warn("This is a warning.");
logger.error("This is an error.");

我只收到 1 封电子邮件。通过将bufferSize 设置为 1,我预计会收到 2 封不同的电子邮件,每封电子邮件中都有 1 条日志消息。怎么回事?

【问题讨论】:

    标签: java logging logback smtpappender


    【解决方案1】:

    正如 Ceki 已经提到的,SMTPAPpender 会触发 ERROR 级别事件的电子邮件。要在一封邮件中获取所有日志,您可以增加缓冲区大小

    10

    这里通过将 bufferSize 增加到 10,您将获得由错误记录的最后 10 条消息。

    查看以下链接: https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/src/com/waheed/tutorial8/Application8.java https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/sample8.xml

    【讨论】:

    • 感谢@Waheed(以及 +1 代码示例)。我仍然没有得到的一件事是:如果我将 bufferSize 增加到 10,然后记录 12 条错误消息会发生什么?我会收到 1 封包含 10 条日志消息的电子邮件吗?如果是这样,最后 2 条消息 (10 + 2 = 12) 会发生什么?再次感谢!
    • 是的,如果您将 bufferSize 值设置为 10,您将只能收到最后 10 条消息。大多数情况下,我们使用 SMTPAppender 通知管理员/操作员您的应用程序出现问题。因此,一旦遇到 ERROR 日志,它就会向您发送一封包含您设置的日志数量的邮件。根据错误日志,您将收到一封邮件。
    • 再次感谢(和 +1!)我很抱歉,我不想在这里成为害虫,但我仍然不明白最后 2 条日志消息会发生什么。假设我的代码连续触发 12 条 logger.error("...") 消息,bufferSize 设置为 10。就像你说的,我会收到 1 封包含 10 条错误消息的电子邮件。 但是最后 2 条错误日志会发生什么? 再次感谢您迄今为止的所有帮助!
    • 我猜你在这里很困惑。正如我所说的每条错误消息,您将收到一封邮件。因此,对于 12 个错误,您将在收件箱中收到 12 封邮件。一旦遇到第一个 logger.error,它就会发送一封邮件。在第二个错误日志中,您将收到另一封邮件。 bufferSize 设置为 10 表示在错误消息之前记录 10 条消息。
    【解决方案2】:

    外发电子邮件的触发由“evaluator”计算。默认情况下,SMTPAppender 带有OnErrorEvaluator,它会在 ERROR 或更高级别的事件上触发电子邮件。因此,默认情况下,SMTPAppender 将在第二条消息(级别为 ERROR)而不是第一条消息(WARN)上发送一封电子邮件。要在 WARN 上触发传出消息,请编写您自己的评估器。代码如下:

    public class OnWarnEvaluator extends EventEvaluatorBase<ILoggingEvent> {
    
     public boolean evaluate(ILoggingEvent event) throws NullPointerException,
               EvaluationException {
       return event.getLevel().levelInt >= Level.WARN_INT;
     }
    }
    

    【讨论】:

    • 是否可以描述/配置这样的评估器或 sg.在log4j.xml 中以声明方式等效(对于Log4J 2.1)?我希望每个 INFO 和 ERROR 日志消息都收到一封电子邮件。
    【解决方案3】:

    要在 WARN 处触发传出消息而不添加新的源文件,您可以 add the Janino dependency 及其评估器:

    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    
        <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <expression>return level >= WARN;</expression>
        </evaluator>
        ...
    </appender>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多