9

我有一个 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>

这确保只有信息和更高(警告,错误)被记录到系统日志。但是,我们使用的第 3 方库之一是在 DEBUG 记录特定事件,我想将此事件记录到 syslog。我想到的第一种方法是尝试重新映射记录器中的日志级别,但不确定这是否可能?就像是:

<logger name="akka.some.Thing" level="DEBUG" logAs="INFO">
  <appender-ref ref="SYSLOG" />
</logger>

显然,“logAs”参数不存在,所以我不能这样做。将 akka.some.Thing 记录到 SYSLOG 附加程序,同时为其他记录器保留过滤器的最佳方法是什么?

另一种方法是创建一个名为 SYSLOG2 的第二个附加程序,它没有适当的过滤器并设置特定的记录器来使用它,但想知道是否有一种方法可以只使用 1 个 SYSLOG 附加程序来配置 logback...

谢谢,

4

2 回答 2

8

我知道这是一个老问题——但实际上可以用一个 SyslogAppender 来做 OP 想要做的事情。

如果其他人正在寻找如何重新映射的示例,您可以查看org.springframework.boot.logging.logback.LevelRemappingAppender类。使用该附加程序,既可以重新映射最终用于日志事件的附加程序,也可以重新映射用于最终日志事件的级别 - 例如,通过将 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>

请注意,重新映射到特定的目标记录器会使查找原始日志事件的源代码变得更加困难——因此请谨慎使用。

于 2015-01-08T12:29:07.793 回答
4

您可以做的是编写具有相同输出的第二个 logger + 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>

这会将您的特定调试任务添加到相同的输出中。

于 2014-02-06T07:36:58.933 回答