代码之家  ›  专栏  ›  技术社区  ›  michid

静态记录器类字段缺少日志输出

  •  0
  • michid  · 技术社区  · 2 年前

    在Jenkins上的Maven构建中执行JUnit测试时,一些日志没有写入控制台。

    class Foo {
        static final Logger log = LoggerFactory.getLogger(Foo.class);
    
        static Logger log() {
            return LoggerFactory.getLogger(Foo.class);
        }
    
        void baz() {
            log.error("error 1")
            log().error("error 2")
        }
    }
    

    方法 baz 从我的JUnit测试中调用 error 2 在Jenkins上执行构建时会记录,但是 error 1 不见了。在当地,我无法重现这个问题。在我的机器上执行相同的Maven构建,我看到了两个日志语句的输出。

    我在Jenkins和本地运行相同的Java版本:

    OpenJDK Runtime Environment Temurin-11.0.16.1+1 (build 11.0.16.1+1)
    

    有什么线索可以导致这种情况,或者我如何进一步深入问题以找到根本原因?

    更新: 我看得出来 Logger 第一条日志语句中的实例与第二条日志语句的实例不同。

    0 回复  |  直到 2 年前
        1
  •  1
  •   michid    2 年前

    事实证明,我们套件中的其他一些测试最终会被调用 LogManager.shutdown 在某个时刻。这会导致静态最终记录器引用变得过时。显然,这是在其他一些无关的更改导致测试执行顺序发生变化,从而导致日志系统关闭后才开始出现的 之前 相关记录器正在另一个测试中使用。