【问题标题】:slf4j / logback - different loglevel for certain threadsslf4j / logback - 某些线程的不同日志级别
【发布时间】:2015-11-25 06:27:42
【问题描述】:

我最近将我们的应用程序从 log4j 更改为 logback / slf4j。一切都很好,但是我想实现一些特定的东西。

我正在开发的应用程序是一个 Web 应用程序。在我们的生产环境中,日志级别为 INFO。我们的服务团队会不时收到门票来处理。如果我们的服务团队在复制票证时,他们可以将日志级别放在 TRACE 上,仅用于他们的测试请求,那就太好了。这样日志文件就不会受到当时所有其他请求的影响。

我们已经使用标题“X-TracingContext-Active=true”将某些额外数据写入日志记录。我的想法是当标题为“真”时仅针对该请求(线程)将日志级别增加到 TRACE。

有没有一种方法可以做到这一点,而无需创建我自己的日志实现或不必在每个类中编写此逻辑?

编辑: X-TracingActive-Context 标头现在在每个请求的开头捕获。此值存储在 ThreadLocal 变量中的辅助类中。我正在考虑重写 isInfoEnabled、isDebugEnabled、... 方法,因此它首先从帮助程序类中读取变量。但我不知道如何在不实现自己的日志框架的情况下覆盖此方法。 logback 的 Logger 类是 final 的。

有什么想法吗?

【问题讨论】:

  • 日志配置存储在日志框架内的中心位置。将其设置为 TRACE 会将其设置为跟踪所有内容,而不仅仅是您的线程。您必须与 Logback 紧密集成以使其成为每个线程并用您自己的配置替换其中的一部分。为每个日志行记录每个请求的 id 可能更容易,因此您可以将这些行关联到单个请求。

标签: java slf4j logback


【解决方案1】:

doublep 的回复让我开始思考。我已经尝试过 logback 的过滤机制,但这还不够。显然 logback 中有两种类型的过滤器:Filter 和 TurboFilter。最后一个是我的问题的解决方案。

在 logback.xml 中我配置了 TurboFilter:

<!-- Turbo Filters -->
<turboFilter class="com.company.application.core.util.LoggingTurboFilter" />

LoggingTurboFilter 类:

import org.slf4j.Marker;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class LoggingTurboFilter extends TurboFilter {

    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level,
            String format, Object[] params, Throwable t) {

        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }

        if(CurrentLogLevelProvider.getTraceActive()){
            return FilterReply.ACCEPT;
        } else {
            return FilterReply.NEUTRAL;
        }
    }

    @Override
    public void start() {
        super.start();
    }
}

现在我可以根据请求覆盖日志级别。

【讨论】:

    【解决方案2】:

    虽然不是您想要的(并且实现起来并不简单),但您可以将所有内容和filter out“错误”线程的级别设置为 TRACE。虽然性能可能/将会非常糟糕,但如果您仅在这些特殊请求期间提升日志级别并在之后将其重置,那么它应该不会那么糟糕。

    【讨论】:

    • 这是我们可以通过 logback MDC 实现的吗?需要相同的功能,但无法使用
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多