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

Java logback SMTPAppender正在不同线程上复制模式,java,logback,smtpappender,Java,Logback,Smtpappender,我没有能够完全一致地再现这一点。我确实怀疑这是logback中的一个bug,但显然这听起来不太可能,在我提交之前,我需要一个干净的可复制测试用例,所以我要求这样做,以防有人看到类似的行为 基本上,我有一个SMTPAppender,看起来像这样: <appender name="QA-SMTP" class="ch.qos.logback.classic.net.SMTPAppender"> <!-- SMTP appends a default

我没有能够完全一致地再现这一点。我确实怀疑这是logback中的一个bug,但显然这听起来不太可能,在我提交之前,我需要一个干净的可复制测试用例,所以我要求这样做,以防有人看到类似的行为

基本上,我有一个
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>

me.unroll.logging.loggers.InfoEmail.QA
smtp.gmail.com
465
真的
测试
测试
测试
测试
%信息
你好线程:%thread
我收到的电子邮件看起来像这样。如果在
main
线程上调用
logger.error(…)
,或者2)当我刚刚创建一个测试池并提交测试池时,这种情况就不会发生,尽管在我发现它的实际生产案例中(在MINA的回调中),这种情况经常发生,但并不一致

你好!!线程:你好!线程:NIO处理器-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到底是如何吞并我的主线程的?不知道),另一个来自所讨论的实际线程


有人见过这种行为或知道如何解决吗?

也许我误解了你的问题,但正如我看到的,你告诉我,logback有时会在一封电子邮件中发送两个事件。这是设计上的,有一个缓冲区大小,允许收集事件包,如果他们来的非常快。文件中有一段引文:

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

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

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

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

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

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

但据我所知,您可以将
asynchronousSending
更改为false,以便在发送消息之前阻止日志记录语句

也许您可以在模式的末尾添加“%n”,这样它就可以用新行分隔日志记录事件,这样它就可以读取了


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

请将ch.qos.logback版本添加到问题中。我个人对1.0.x有奇怪的问题。尝试更新到最新的稳定版本。您还可以粘贴代码吗?这将是一个很大的帮助。@JintianDENG不幸的是,没有,这并没有清晰或简单地复制,需要很多类来正确设置。@user1516873是的,我在1.0.x上,将确保这是最新的,并查看是否修复。是的,我理解这一点-但缓冲逻辑不应导致从两个单独的线程触发相同的事件。@djechlin我没有看到相同的事件。正如我看到的,您有两个事件,不同的消息“已创建”和“12345”,不同的时间戳02:48:09和15:24:06。。。你为什么认为这是同一件事?