slf4j / logback - 某些线程的不同loglevel

时间:2015-08-31 09:03:25

标签: java slf4j logback

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

我正在处理的应用程序是一个Web应用程序。在我们的生产环境中,日志级别位于INFO上。门票不时进入我们的服务团队处理。很高兴,当我们的服务团队正在复制门票时,他们可以将日志级别放在TRACE上,以满足他们的测试请求。这样,日志文件就不会与当时进入的所有其他请求混淆。

我们已经使用标题" X-TracingContext-Active = true"将某些额外数据写入日志记录。我的想法是当标题是“真实”时将loglevel增加到TRACE。只是那个请求(线程)。

有没有办法在不需要创建自己的日志记录实现或必须在每个类中编写此逻辑的情况下执行此操作?

编辑: 现在,在每个请求开始时捕获X-TracingActive-Context标头。该值存储在ThreadLocal变量的辅助类中。我想要覆盖isInfoEnabled,isDebugEnabled,...方法,因此它首先从辅助类中读取变量。但我不知道如何在不实现自己的日志框架的情况下覆盖此方法。 Logger的logback类是最终的。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

虽然不是你想要的(并且不是很容易实现),但你可以为所有内容和filter out“错误”线程设置TRACE级别。虽然性能可能会非常糟糕,但是如果你只在这些特殊请求的持续时间内提高日志级别并在之后重新设置它,那么它应该不会那么糟糕。

答案 1 :(得分: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();
    }
}

现在我可以覆盖每个请求的日志级别。