当前位置: 首页 > 知识库问答 >
问题:

日志:两个附加程序,多个日志程序,不同的级别

丁德义
2023-03-14

我希望在我的应用程序(Spring Integration)中有两个日志文件,Debug.log和Main.log。我想在信息级别运行main.log,在调试级别运行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>

总结一下:

  • Spring记录器
    • 主->错误
    • 调试->调试
    • 主->信息
    • 调试->调试

    因此,我必须让记录器在DEBUG运行,而附加器上的阈值筛选器粒度不够细。

    更新增加了问题的清晰度

共有1个答案

单于骁
2023-03-14

创建一个ThresholdLoggerFilter类,它可以放在一个appender上,如:

<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();
        }
    }
}
 类似资料:
  • 问题内容: 是否可以基于附加程序为单个Logger配置不同的日志级别? 我意识到这与这个问题类似,这是我已经了解到的,但是问题是该阈值适用于登录到该附加程序的所有记录器,而我只希望该阈值适用于单个记录器。 即到目前为止,我有这样的事情: 我希望将 Mylogger的 DEBUG消息发送到 日志文件 追加器,但是我也希望将 Mylogger的 INFO消息发送到 stdout 追加器(但对于所有其他

  • 我正在使用log4j2记录应用程序的事件。然而,我被以下问题所困扰。 当前,所有日志记录消息都被写入到两个不同的附加程序中。一个具有RollingFile类型,而另一个具有Console类型。 编辑: 我看到很多问题,要求只将某个级别的消息写入文件,而将不同级别的消息写入不同文件。在我的情况下,我需要将具有一定级别的更高的消息写入到不同的文件中。例如,在我提供的情况下,带有级别错误或致命的消息将同

  • 问题内容: 我想在我的应用程序(Spring Integration)中有两个日志文件,debug.log和main.log。我想在INFO级别运行main.log,在DEBUG级别运行debug.log。这可以通过追加程序上的过滤器完成。我想根据源将不同级别记录到附加程序。换一种说法 总结一下: 弹簧记录器 主要->错误 调试->调试 com.myapp记录器 主要->信息 调试->调试 因此,

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

  • 以下是我的java logback配置: 我想在这里做的是:我有两个日志追加器:一个用于控制台,另一个用于日志文件;但是对于相同的java软件包(例如:组织.apache.zookeeper),我想使用两个不同的日志级别,INFO用于文件追加器和错误用于康多尔;但是我的日志配置优势无法正常工作。任何人都可以找出我的错误或一些解决方案吗?

  • 我很高兴地使用SLF4J和logback和使用2个附加为根记录器。 stdout的调试级别 文件的信息级别 所有日志都需要成为输出的一部分(因此需要根记录器)。