当前位置: 首页 > 面试题库 >

注销:两个附加程序,多个记录器,不同级别

严兴旺
2023-03-14
问题内容

我想在我的应用程序(Spring
Integration)中有两个日志文件,debug.log和main.log。我想在INFO级别运行main.log,在DEBUG级别运行debug.log。这可以通过追加程序上的过滤器完成。我想根据源将不同级别记录到附加程序。换一种说法

<logger name="org.springframework" level="ERROR">
    <appender-ref ref="main" />
</logger>
<logger name="org.springframework" level="DEBUG">
    <appender-ref ref="debug" />
</logger>
<logger name="com.myapp" level="INFO">
    <appender-ref ref="main" />
</logger>
<logger name="com.myapp" level="DEBUG">
    <appender-ref ref="debug" />
</logger>

总结一下:

  1. 弹簧记录器
    • 主要->错误
    • 调试->调试
  2. com.myapp记录器
    • 主要->信息
    • 调试->调试

因此,我必须使记录器在DEBUG上运行,并且追加器上的阈值过滤器不够精细。

更新 为问题增加了清晰度


问题答案:

创建一个ThresholdLoggerFilter类,可以将其放在附加器上,例如:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <filter class="com.myapp.ThresholdLoggerFilter">
        <logger>org.springframework</logger>
        <level>ERROR</level>
    </filter>
    </appender>

以下代码有效

package com.myapp;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;

public class ThresholdLoggerFilter extends Filter<ILoggingEvent> {
    private Level level;
    private String logger;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }

        if (!event.getLoggerName().startsWith(logger))
            return FilterReply.NEUTRAL;

        if (event.getLevel().isGreaterOrEqual(level)) {
            return FilterReply.NEUTRAL;
        } else {
            return FilterReply.DENY;
        }
    }

    public void setLevel(Level level) {
        this.level = level;
    }

    public void setLogger(String logger) {
        this.logger = logger;
    }

    public void start() {
        if (this.level != null && this.logger != null) {
            super.start();
        }
    }
}


 类似资料:
  • 我们有两个不同的ASP.NET应用程序启用了Log4net日志记录。它们都有相同的log4net1.2.10.0版本。

  • 我希望在我的应用程序(Spring Integration)中有两个日志文件,Debug.log和Main.log。我想在信息级别运行main.log,在调试级别运行DEBUG.log。这可以通过附加程序上的筛选器来实现。我想根据源记录不同级别的附加程序。换句话说,也就是 总结一下: Spring记录器 主->错误 调试->调试 主->信息 调试->调试 因此,我必须让记录器在DEBUG运行,而附

  • 在使用log4j写入多个日志文件时,我遇到了重复日志消息的问题。 目前,我正在尝试在我的文件中记录名为foobar的特定记录器的级数据(及以上),然后在文件中记录所有记录器的所有级日志消息(及以上)。 因此,重复的日志消息被写入文件(每行记录两次),经过一些快速研究,我发现解决这一问题的建议是将添加到属性文件中。 这样做的问题是,尽管它会阻止重复行,但foobar记录器的消息从未写入文件。 我的l

  • 我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。

  • 我还希望com.mypack的级别“trace”与“info”的行为方式相同。到目前为止,我还没有取得任何成功。我需要像这样的东西 感谢你的帮助。