强制slf4j按顺序打印日志

Red*_*ddy 5 java junit logback slf4j maven

我正在使用slf4j进行log-back.有时日志不按顺序打印(时间戳).我们可以强制它以与代码运行时相同的顺序登录吗?

更新1:通过maven在Jenkins上运行单元测试时会发生这种情况.它一直在发生.来自代码的第一个日志语句即将来自单元测试的日志语句.

此外,所有的logback文件看起来都很正常如下.

  <appender name="STDOUT"
            class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
Run Code Online (Sandbox Code Playgroud)

更新2:日志片段是这样的(我已编辑文件名等..).在test1执行期间,我们调用代码来反转由于某些错误而失败的事务.但奇怪的是,首先打印异常,然后打印测试方法的日志语句.同时日志报表的时间戳是作为预期,但他们的文件中的顺序是不同的(14时33分34秒.718自带14时33分34秒之前.449)

14:33:34.667 [869082978@qtp-1587505558-0] [] WARN  org.hibernate.ejb.Ejb3Configuration - hibernate.connection.autocommit = false break the EJB3 specification
14:33:34.718 [869082978@qtp-1587505558-0] [] WARN  o.h.impl.SessionFactoryObjectFactory - InitialContext did not implement EventContext
14:33:34.843 [869082978@qtp-1587505558-0] [] DEBUG c.r.a.exception.ExceptionMapper - <3003> can't reverse transaction. [id=10000000100120014]
.
.
.
.
.
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test0: finished.
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test1: started.
.
.
.
.
14:33:34.449 [main] [] DEBUG c.r.a.test - reversing transaction, id=10000000100120014
14:33:34.856 [main] [] DEBUG c.r.a.test - ========================= test2: started.
Run Code Online (Sandbox Code Playgroud)

更新3:我们的项目使用maven,有多个模块.我们必须logback-test.xmlsrc/test/resources文件夹中.

项目结构是这样的
codemodule/src/test/resources/logback-test.xml- 这个模块将打包在jar文件中.测试用例调用此模块的代码.
parent/src/test/resources/logback-test.xml - 这是父模块,它将所有其他模块的jar文件和包裹包装成战争.这是我运行测试用例并调用模块代码的地方.

我在测试用例代码和实际代码中都有日志语句.我已经检查过,测试用例和代码都使用了父级的logback文件中的模式(codemodule中的模式不同).它在打印测试用例日志之前始终打印代码的日志语句.

我们也没有并行运行测试.
Concurrency config is parallel='none', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false

更新4:我理解这个问题.我们正在进行http请求而不是直接方法调用.所以测试用例在main线程中运行,实际代码在另一个线程中运行(谢谢Sebbe).

我理解强制记录序列可能会受到性能影响但是对于问题的完整性我会再问一个问题.

由于两个日志都是单个appender(STDOUT),我可以强制它以时间戳的顺序登录吗?

小智 2

从日志本身您可以看到至少有 2 个线程正在运行: 869082978@qtp-1587505558-0main

您无法控制单独线程将其事件记录到同一输出的顺序(您可能可以,但这将是一个坏主意)。

首先从您的日志线程869082978@qtp-1587505558-0获取对控制台的写访问权限。写入时,会从 记录事件main。一旦869082978@qtp-1587505558-0释放它的锁,main获取它,它就可以将其日志刷新到文件中。