两个记录器引用相同的文件追加器,一个写另一个不写

Two loggers referencing same file appender, one writes the other does not

给定以下 logback xml 配置:

<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.dir}/app-traffic</File>
        <encoder>
            <pattern>%message%n</pattern>
        </encoder>
        <rollingPolicy class="org.app.traffic.policy.AppTimeBasedRollingPolicy">
            <FileNamePattern>${log.dir.archived}/app-traffic.%d{yyyyMMdd}</FileNamePattern>
        </rollingPolicy>
    </appender>

    <logger name="org.my.package.FirstClass" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="APPLICATION"/>
    </logger>
    <logger name="org.my.different.package.SecondClass" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="APPLICATION"/>
    </logger>

FirstClass 不会写入 app-trafic 日志,即使我看到它在调试时触发了它的 info() 方法。 SecondClass 记录器成功写入日志。

怎么会这样?

编辑: 调试第一个记录器 info 调用显示它正在被过滤,因为只允许警告消息?不知道为什么会这样,因为两个配置都是针对 INFO

我建议启用 logback 本身的调试输出,使用标志

-Dlogback.debug=true

启动时。查看输出是否获取了与预期不同的配置文件(可能是 logback-test.xml)或者日志级别是否设置在其他地方...

问题的根本原因是我的应用程序 class 实现了 ch.qos.logback.classic.selector.ContextSelector。实际上有两个,一个是错误进口的。并设置:

System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, LogbackContextSelector.class.getName());

它有一个方法 getLoggerContext,它以非常类似巫术的方式在运行时更改了 logback 上下文。花了一段时间才找到这个。希望对以后的人有帮助。