【问题标题】:Logback: modify message via filter?Logback:通过过滤器修改消息?
【发布时间】:2013-03-04 14:08:58
【问题描述】:

匹配过滤器后是否可以修改日志事件?

我有一个 Web 容器 (Jersey),它在 ERROR 级别记录未捕获的异常。但是,对于服务器(Jetty)抛出的某些异常(EofException),我想将它们记录在较低级别(INFO)。

我可以使用与异常类型 (EofException) 匹配的 Logback 过滤器完全删除这些消息。但是我还没有找到支持的方法来修改日志事件,例如更改日志级别。

【问题讨论】:

  • 这个可以代替吗:stackoverflow.com/questions/6143929/…
  • 我想要类似的东西,但要更改日志级别而不是直接拒绝消息。
  • 如果级别在最后一刻“改变”,就在 appender 记录之前,你还好吗?如果是这样,您可以编写自己的附加程序。
  • 我宁愿改变实际的消息,以便以后的过滤和路由正常工作。
  • 看起来这是a rejected feature request。

标签: java slf4j logback


【解决方案1】:

您可以使用 TurboFilter 模拟此行为,方法是使用提供的记录器记录您自己修改的消息,并拒绝原始消息。

不过,我不相信这种 hack 是个好主意。

package com.example.logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;

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

public class LogbackTest
{
    private static class ModifyingFilter
    extends TurboFilter
    {
        @Override
        public FilterReply decide(
                Marker marker,
                ch.qos.logback.classic.Logger logger, 
                Level level,
                String format, 
                Object[] params, 
                Throwable t)
        {
            if (level == Level.ERROR &&
                logger.getName().equals("com.example.logback.LogbackTest") &&
                format.equals("Connection successful: {}"))
            {
                logger.debug(marker, format, params);
                return FilterReply.DENY;
            }

            return FilterReply.NEUTRAL;
        }
    }

    public static void main(String[] args)
    {
        LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
        lc.addTurboFilter(new ModifyingFilter());

        Logger logger = LoggerFactory.getLogger(LogbackTest.class);
        logger.error("Connection successful: {}", "no problem", new RuntimeException("Hi"));
    }
}

【讨论】:

  • 感谢上帝,你们是精灵
  • 由于这是拒绝原始并再次记录它,原始方法名称(%M 或 %method)更改为“决定”,因为它本质上是在此方法中记录的。你如何避免这种情况?
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2021-03-17
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多