强制slf4j按顺序打印日志

时间:2012-02-21 12:05:40

标签: java maven junit slf4j logback

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

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

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

  <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)。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

相关问题