logback SMTPAppender在不同的线程上复制模式

时间:2013-02-20 02:07:28

标签: java logback smtpappender

我无法始终如一地重现这一点。我怀疑这是一个logback中的错误,但显然这听起来不太可能,在提交之前我需要一个干净的可重复的测试用例,所以我要求SO,以防有人看到类似的行为。

基本上我有SMTPAppender看起来像这样:

<appender name="QA-SMTP"
    class="ch.qos.logback.classic.net.SMTPAppender">
            <!-- SMTP appends a default evaluator of on error, this is the simplest evaluator I found to implement -->
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
        <marker>me.unroll.logging.loggers.InfoEmail.QA</marker>
    </evaluator>

    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>465</smtpPort>
    <SSL>true</SSL>
    <username>test</username>
    <password>test</password>
    <from>test</from>
    <to>test</to>
    <subject>%message</subject>
    <layout>
        <pattern>hello! thread: %thread</pattern>
    </layout>
</appender>

我收到的电子邮件看起来像这样。这没有发生1)如果在logger.error(...)线程上调用main,或者2)当我刚刚创建一个测试池并提交时,虽然它经常 - 但不< / em>始终如一 - 发生在我发现它的实际生产情况中(来自MINA的回调)。

  

您好!线程:mainhello!线程:NioProcessor-2

另一个与另一个appender匹配的案例,为简洁起见省略:

  

为用户/。

创建了操作      

由机器创建:ip-10-212-90-140.ec2.internal   时间戳:2013年2月19日,02:48:09.747   记录器来源:me.unroll.logging.loggers.InfoEmail   在应用程序中:监控客户端雅虎   ============================对用户12345 / test@gmail.com采取了措施

     

由机器创建:ip-10-212-90-140.ec2.internal   时间戳:2013年2月19日,15:24:06.016

“用户ID /电子邮件”取自MDC - 这就是为什么我有明确打印线程的想法。从本质上讲,它看起来像是创建了一个相同的日志事件,一个来自主线程(如何在logback上设法附加我的主线程?dunno)和一个来自实际的线程。

有没有人看过这种行为或知道如何修复?

1 个答案:

答案 0 :(得分:1)

也许我误解了你的问题,但正如我看到你说的那样,有时会在一封电子邮件中发送两个事件。根据设计,有一个bufferSize,它允许收集事件包,如果它们来得非常快。文档引用了一句话:

  

SMTPAppender在一个或多个固定大小的缓冲区中累积日志记录事件,并在用户指定的事件发生后在电子邮件中发送相应缓冲区的内容。 SMTP电子邮件传输(发送)是异步执行的。默认情况下,电子邮件传输由级别ERROR的日志记录事件触发。

您已将评估者更改为基于标记的。这意味着附加到记录器的先前事件将位于缓冲区中,直到市场化事件发生。

还要注意评估者如何触发电子邮件传输。

  

因此,SMTPAppender发送的任何电子邮件中传递的日志事件数量都超过了256个。

如果您希望每个电子邮件都有单个事件,则应将缓冲区大小更改为1.但我怀疑如果邮件速度快于发送电子邮件,它会丢弃邮件:

  

SMTPAppender仅在其循环缓冲区中保留最后256个日志记录事件,在其缓冲区已满时丢弃旧事件。

但据我了解,您可以将asynchronousSending更改为false,以便在发送邮件之前阻止记录语句。

也许您可以在模式的末尾添加“%n”,这样它就会将记录事件与新行分开,因此它是可读的。

免责声明:我刚刚阅读文档而从未尝试过自己,所以不要相信,只是在家里试试。