我正在通过登录使用slf4j。有时日志未按顺序(时间戳)打印。
我们可以强制它以与代码运行相同的顺序登录吗?

更新1 :通过Maven在Jenkins上运行单元测试时,会发生这种情况。它一直在发生。来自代码的第一个日志语句到来,然后来自单元测试的日志语句到来。

同样,所有的注销文件看起来都很正常,如下所示。

  <appender name="STDOUT"
            class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">

更新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.

更新3 :我们的项目使用maven,并且有多个模块。我们在logback-test.xml文件夹中有src/test/resources

项目结构是这样的codemodule/src/test/resources/logback-test.xml-此模块将打包在jar文件中。测试用例调用该模块的代码。parent/src/test/resources/logback-test.xml-这是父模块,它将所有其他模块的jar文件和程序包包装到war中。这是我运行测试用例的地方,它调用上述模块的代码。

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

另外,我们不会并行运行测试。Concurrency config is parallel='none', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false
更新4 :我了解问题所在。我们正在发出http请求,而不是直接方法调用。因此,测试用例在main线程中运行,而实际代码在另一个线程中运行(感谢Sebbe)。

我知道强制日志记录顺序可能会影响性能,但出于问题的完整性,我将再问一个问题。

由于两个日志都将进入单个追加程序(STDOUT),因此我可以强制其以时间戳的顺序进行日志记录吗?

最佳答案

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

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

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

09-30 17:50
查看更多