我无法始终如一地重现这一点。我怀疑这是一个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)和一个来自实际的线程。
有没有人看过这种行为或知道如何修复?
答案 0 :(得分:1)
也许我误解了你的问题,但正如我看到你说的那样,有时会在一封电子邮件中发送两个事件。根据设计,有一个bufferSize,它允许收集事件包,如果它们来得非常快。文档引用了一句话:
SMTPAppender在一个或多个固定大小的缓冲区中累积日志记录事件,并在用户指定的事件发生后在电子邮件中发送相应缓冲区的内容。 SMTP电子邮件传输(发送)是异步执行的。默认情况下,电子邮件传输由级别ERROR的日志记录事件触发。
您已将评估者更改为基于标记的。这意味着附加到记录器的先前事件将位于缓冲区中,直到市场化事件发生。
还要注意评估者如何触发电子邮件传输。
因此,SMTPAppender发送的任何电子邮件中传递的日志事件数量都超过了256个。
如果您希望每个电子邮件都有单个事件,则应将缓冲区大小更改为1.但我怀疑如果邮件速度快于发送电子邮件,它会丢弃邮件:
SMTPAppender仅在其循环缓冲区中保留最后256个日志记录事件,在其缓冲区已满时丢弃旧事件。
但据我了解,您可以将asynchronousSending
更改为false,以便在发送邮件之前阻止记录语句。
也许您可以在模式的末尾添加“%n”,这样它就会将记录事件与新行分开,因此它是可读的。
免责声明:我刚刚阅读文档而从未尝试过自己,所以不要相信,只是在家里试试。