【问题标题】:SLF4J log same class at different levels in different appendersSLF4J 在不同的 appender 中记录不同级别的相同类
【发布时间】:2018-01-21 07:12:22
【问题描述】:

我有两个附加程序,在本例中是一个控制台附加程序和一个滚动文件附加程序。 对于某个类的日志输出(在本例中为 com.google.api.client.http.HttpTransport),如何让该类在一个附加程序中以DEBUG 级别登录,在另一个附加程序中以WARN 级别登录?

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

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

感谢大家的回复!我很高兴通过阅读有关“正确”方法的意见来了解更多信息,请在继续之前检查您是否首先回答了原始问题:)

【问题讨论】:

  • 您能否更新您的问题以说明您正在使用哪种日志记录实现?回溯?日志4j? java.util.logging?

标签: java logging slf4j


【解决方案1】:

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

你的问题是:

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

所以,我假设您正在以编程方式创建附加程序。您可以创建一个 ThresholdFilter 并将其与附加程序相关联,如下所示:

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);
...

然后您需要将这些附加程序与特定记录器相关联,如下所示:

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多