15

フィルターに一致した後にログ イベントを変更することはできますか?

エラー レベルでキャッチされない例外をログに記録する Web コンテナー (Jersey) があります。ただし、サーバー (Jetty) によってスローされる特定の例外 (EofException) については、それらをより低いレベル (INFO) でログに記録したいと考えています。

例外タイプ (EofException) に一致する Logback フィルターを使用して、これらのメッセージを完全に削除できます。しかし、ログ イベントを変更する方法 (ログ レベルの変更など) がサポートされていません。

4

1 に答える 1

21

独自の変更されたメッセージを提供されたロガーでログに記録し、元のメッセージを拒否することで、TurboFilter を使用してこの動作をシミュレートできます。

ただし、この種のハックが良いアイデアであるとは確信していません。

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"));
    }
}
于 2013-04-18T16:25:22.840 に答える