gpt4 book ai didi

java - 强制slf4j按顺序打印日志

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:11 25 4
gpt4 key购买 nike

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

更新 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,有多个模块。我们在 src/test/resources 文件夹中有 logback-test.xml

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

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

此外,我们没有并行运行测试。
并发配置为 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 获取它并且它可以将它的日志刷新到文件中。

关于java - 强制slf4j按顺序打印日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9377315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com