我有一个logback配置,它有一个带有阈值过滤器的appender:
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
...
</appender>
这确保只有info和更高(警告,错误)记录到syslog。但是,我们使用的第三方库之一是在DEBUG中记录特定事件,我想将此事件记录到syslog中。我想到的第一种方法是尝试重新映射记录器中的日志级别,但我不确定这是否可行?类似的东西:
<logger name="akka.some.Thing" level="DEBUG" logAs="INFO">
<appender-ref ref="SYSLOG" />
</logger>
显然,“logAs”参数不存在,所以我不能这样做。将akka.some.Thing记录到SYSLOG appender同时为其他记录器留下过滤器的最佳方法是什么?
另一种方法是创建一个名为SYSLOG2的第二个appender,它没有适当的过滤器并设置特定的记录器来使用它,但是想知道是否有一种方法只用1个SYSLOG appender来配置logback。 ..
谢谢,
答案 0 :(得分:6)
我知道这是一个老问题 - 但实际上可以通过单个SyslogAppender执行OP想要做的事情。
如果其他人正在搜索如何重新映射的示例,则可以查看org.springframework.boot.logging.logback.LevelRemappingAppender类。 使用该appender,可以重新映射最终用于日志事件的appender,并且还可以重新映射用于最终日志事件的级别 - 例如,通过将DEBUG级别更改为INFO级别。
logback配置文件中的用法示例(取自https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml):
<appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
<!-- Optional: specify the destination logger the event ends up in -->
<destinationLogger>org.springframework.boot</destinationLogger>
<!-- Optional: specify log level remapping -->
<remapLevels>INFO->DEBUG,ERROR->WARN</remapLevels>
</appender>
<logger name="org.thymeleaf" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
请注意,重新映射到特定目标记录器可能会使查找原始日志事件的源代码变得更加困难 - 因此请谨慎使用。
答案 1 :(得分:3)
你可以做的是写一个具有相同输出的第二个记录器+ appender:
<appender name="SYSLOG-2" class="ch.qos.logback.classic.net.SyslogAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
...
</appender>
<logger name="akka.some.Thing" level="DEBUG">
<appender-ref ref="SYSLOG-2" />
</logger>
这会将您的特定DEBUG任务添加到同一输出中。