来自 java.util.logging 的 ICM 日志

Logs from java.util.logging in ICM

在我的磁带中,我使用了一个使用 java.util.logging 记录的外部库。我想将日志重定向到 SLF4J/logback,但不知怎的,这并没有像我预期的那样工作(日志是空的)。这是相关的logback配置:

<appender name="PayPal_LogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>TRACE</level>
    </filter>       
    <File>${intershop.logfile.Directory}/paypal-${intershop.logfile.NamePostfix}.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${intershop.logfile.Directory}/paypal-${intershop.logfile.NamePostfix}.%d{yyyy-MM-dd}.log</FileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>
            [%date{yyyy-MM-dd HH:mm:ss.SSS Z}] %-5level ${intershop.HostName} ${intershop.InstallationID} ${intershop.ServerName} [%mdc{requestsite}] [%mdc{requestapplication}] %logger [%marker] [%mdc{request.type}] [%mdc{session.id}] [%mdc{request.uuid}] &quot;%thread&quot; %msg %ex%n
        </pattern>
    </encoder>
</appender> 

<logger name="com.paypal" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="Error" />
    <appender-ref ref="PayPal_LogFile" />
</logger>

JUL 登录 DEBUG 级别,DEBUG 级别允许 com.paypal,我认为这应该在 SLF4J 中转换为 INFO。怎么了?

我会answer my own question.

问题的原因是记录器的additivity="false" 属性。

背景: 从其他日志框架到 SLF4J 的路由通常很容易通过所谓的桥接,除非我们谈论 JUL。查看详情 here。 ICM 在 JUL 和 SLF4J 之间实现了自己的桥梁,并且内部存在一个微妙的错误。 ICM 的日志记录处理程序附加到根级别,任何带有 additivity="false" 的附加程序都不会工作,因为它永远不会到达根级别。

BUG 好像出在这里com.intershop.beehive.core.internal.log.JavaLoggingAdapter:

handler = new JavaLoggingHandler();
handler.setLevel(Level.ALL);
Logger root = LogManager.getLogManager().getLogger(""); 
root.addHandler(handler);

我已经将可加性更改为 true 虽然我对此不是很满意,但现在我可以探索第三方日志了。