【问题标题】:Two loggers referencing same file appender, one writes the other does not两个记录器引用相同的文件附加程序,一个写入另一个不
【发布时间】:2021-12-29 09:28:15
【问题描述】:

给定以下 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 logger 成功写入日志。

这怎么可能?

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

【问题讨论】:

    标签: logging logback


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      -Dlogback.debug=true
      

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

      【讨论】:

      • 这是个好建议!希望我能早点看到它:)我已经找到了问题,将发布答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 2014-02-06
      • 2010-11-18
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多