4

我无法始终如一地重现这一点。我确实怀疑这是 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)当我刚刚创建一个测试池并提交时,虽然它经常 - 但不是始终 - 发生在我发现它的实际生产案例中(其中正在接受来自 MINA 的回调)。

你好!线程:主你好!线程:NioProcessor-2

另一种情况与另一个附加程序匹配,为简洁起见省略:

已为用户 / 创建了操作。

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

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

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

有没有人看到这种行为或知道如何解决?

4

1 回答 1

1

也许我误解了你的问题,但正如我所见,你说 logback 有时会在一封电子邮件中发送两个事件。按照设计,有一个 bufferSize 允许收集事件包,如果它们来得很快。文档中有一段引用:

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

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

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

因此,SMTPAppender 发送的任何电子邮件中传递的日志记录事件的数量上限为 256。

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

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

但据我了解,您可以更改asynchronousSending为 false ,因此它将阻止日志记录语句,直到发送消息。

也许你可以在模式的末尾添加“%n”,这样它就会用一个新的行分隔日志事件,这样它就可以阅读了。

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

于 2013-03-05T09:50:45.747 回答