Java logback:登录到System.out&;时的竞争条件;犯错误

Java logback:登录到System.out&;时的竞争条件;犯错误,java,eclipse,logging,slf4j,logback,Java,Eclipse,Logging,Slf4j,Logback,我尝试以将错误记录到System.err,而将其他日志事件记录到System.out的方式配置回日志。 到目前为止,我想到的最好的方法是用过滤器定义两个appender。这解决了主要问题,但引入了一个我希望避免的新问题: 对于两个附加器,有时会出现日志事件的记录顺序混淆的情况。 示例: 代码中:信息日志后跟错误日志。 在控制台上:在info事件之前将错误记录到控制台 我对如何在将错误记录到System.err和其他记录到System.out的同时避免此问题的所有想法都感兴趣。在这种情况下,恐怕您

我尝试以将错误记录到System.err,而将其他日志事件记录到System.out的方式配置回日志。 到目前为止,我想到的最好的方法是用过滤器定义两个appender。这解决了主要问题,但引入了一个我希望避免的新问题: 对于两个附加器,有时会出现日志事件的记录顺序混淆的情况。
示例:
代码中:信息日志后跟错误日志。
在控制台上:在info事件之前将错误记录到控制台


我对如何在将错误记录到System.err和其他记录到System.out的同时避免此问题的所有想法都感兴趣。

在这种情况下,恐怕您通常无法强制执行“正确”顺序。消息被写入两个不同的流中,这两个流被独立地刷新到输出介质中,这取决于许多不受代码或回写控制的事情,以及两个流的内容在输出中的混合方式。请尝试一个简单的例子:

    while(true) {
        System.out.println("XXX");
        System.err.println("YYYYYY");
    }

虽然我的代码是同步的,但是XXX和YYYYY字符串在我的控制台上随机混合(随机打印“XXX”或“YYYYYY”行的集群)。logback在幕后也做着类似的事情,无法强制你的控制台打印出两个独立的流。

谢谢你的例子。我没想到结果会如此极端。但由于我在使用logback之前没有注意到这种效果(我以前一直通过打印到out和err来登录),我怀疑logback引擎盖下的某些东西会加剧这个问题。我想知道是否有可能降低这种情况发生的几率?