- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在登录时使用 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-0
和 main
。
您无法控制单独的线程将它们的事件记录到相同输出的顺序(您可能可以,但这是个坏主意)。
从您的日志线程 869082978@qtp-1587505558-0
首先获得对您的控制台的写入权限。在写入时,事件从 main
记录下来。一旦 869082978@qtp-1587505558-0
释放它的锁,main
获取它并且它可以将它的日志刷新到文件中。
关于java - 强制slf4j按顺序打印日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9377315/
我是一名优秀的程序员,十分优秀!