SLF4J在不同的appender中的不同级别记录相同的类

时间:2018-01-21 07:12:23

标签: java logging slf4j

我有两个appender,在这种情况下是一个控制台appender和一个滚动文件appender。 对于某个班级'日志输出(在这种情况下是com.google.api.client.http.HttpTransport),如何让这个类在一个appender中以DEBUG级别登录,在另一个appender中以WARN级别登录?

这似乎并不是一件非常复杂的问题,但不幸的是,它似乎完全超出了我能找到的典型用例。我并没有试图避免编写我自己的过滤器,但如果这真的是答案,我会感到惊讶。

我使用的是Spring Boot,如果重要的话,我更喜欢使用JavaConfig。

感谢大家的回复!我非常乐意通过阅读关于“权利”的意见来了解更多信息。要做到这一点,请在继续之前检查您是否先回答了原始问题:)

1 个答案:

答案 0 :(得分:1)

您可以使用Logback的ThresholdFilter来过滤appender收到的事件,并且可以将这些过滤的appender与此类的记录器相关联:com.google.api.client.http.HttpTransport

你的问题是:

  

我正在使用Spring Boot,如果重要的话,我更喜欢使用JavaConfig。

所以,我假设你是以编程方式创建appender。您可以创建ThresholdFilter并将其与appender关联,如下所示:

ConsoleAppender consoleAppender = new ConsoleAppender();
ThresholdFilter debugFilter = new ThresholdFilter();
debugFilter.setLevel("DEBUG");
consoleAppender.addFilter(debugFilter);
...

FileAppender<ILoggingEvent> fileAppender = new FileAppender<>();
ThresholdFilter warnFilter = new ThresholdFilter();
warnFilter.setLevel("WARN");
fileAppender.addFilter(warnFilter);
...

然后,您需要将这些appender与特定记录器关联起来,如下所示:

Logger logger = (Logger) LoggerFactory.getLogger("com.google.api.client.http.HttpTransport");
logger.addAppender(fileAppender);
logger.addAppender(consoleAppender);

这是使用XML配置的相同方法:

<appender name="DEBUG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- only accept DEBUG log events -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>DEBUG</level>
    </filter>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>...</pattern>
    </encoder>
</appender>

<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- only accept WARN log events -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>...</fileNamePattern>
    </rollingPolicy>

    <encoder>
        <pattern>...</pattern>
    </encoder>
</appender>

<!-- associate this logger instance with the two appenders -->
<logger name="com.google.api.client.http.HttpTransport">
    <appender-ref ref="DEBUG_STDOUT"/>
    <appender-ref ref="WARN_FILE"/>
</logger>