在我的墨盒中,我使用了一个使用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}] "%thread" %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>
DEBUG
允许JUL登录DEBUG
级别,com.paypal
级别,我相信这应该转换为INFO
中的SLF4J
。怎么了?
答案 0 :(得分:0)
出现问题的原因是记录器的additivity="false"
属性。
背景:除非我们谈论JUL,否则从其他日志框架到SLF4J的路由通常很容易通过所谓的桥接。查看详细信息here。 ICM在JUL和SLF4J之间实现了自己的桥梁,里面有一个微妙的bug。 ICM的日志记录处理程序附加到根级别,任何具有additivity="false"
的appender将无法工作,因为它永远不会到达根级别。
该错误似乎在com.intershop.beehive.core.internal.log.JavaLoggingAdapter
:
handler = new JavaLoggingHandler();
handler.setLevel(Level.ALL);
Logger root = LogManager.getLogManager().getLogger("");
root.addHandler(handler);
我已经改变了true
的可加性,虽然我对此并不高兴,现在我可以探索第三方日志了。