3

クラスのメソッドのログをオフにしたい。下記参照:

package com.mypackage;

public class A {
    public static void aaa() { 
        logger.info("hello"); 
    }

    public static void bbb() { 
        logger.info("hello"); 
    }
}

.

# This works and nothing gets logged by A
log4j.category.com.mypackage.A=off

.

#this does not work. (I am trying to switch off only the static method)
log4j.category.com.mypackage.A.aaa=off

メソッド単位でオフにできるかどうか (ログ レベルを変更) できるかどうかは誰にもわかりませんか?

ありがとう

注: コードを変更したくありません (これは、コードが既に有効であるためです。単に構成ファイルである既存の log4j を変更したいだけです)。

4

3 に答える 3

3

できることは、メソッドごとに 1 つずつ、2 つの異なるロガーを持つことです。

private static final Logger logAAA = Logger.getLogger("some.logger.name.for.AAA");
private static final Logger logBBB = Logger.getLogger("some.other.name.for.BBB");

次に、構成でそれらに異なるログ レベルを定義します。

于 2013-02-19T17:23:15.030 に答える
3

Filterこれは、ロガー名と呼び出しメソッドをチェックする特定のものを実装することで実際に可能です。フィルタは、クラスとメソッド名でLoggingEventを取得できる を受け取ります。LocationInfo

これはスタック トレースでリフレクションを使用するため、非常に非効率的であることに注意してください。注意して行ってください。特に、必要な場合にのみリフレクションを実行するように、まずを取得する前にロガー名を確認してください。LocationInfo

フィルターの構成は、XML Log4j 構成ファイルを介してのみ可能です。

迅速な実装:

フィルタ クラス:

public class MethodBasedFilter extends Filter {

    @Override
    public int decide(LoggingEvent event) {
        if (event.getLoggerName().equals(LoggingWithMethodFiltering.class.getCanonicalName())) {
            if (event.getLocationInformation().getMethodName().equals("filteredMethod")) {
                return Filter.DENY;
            }
        }
        return Filter.NEUTRAL;
    }
}

フィルタリングされたクラス:

public class LoggingWithMethodFiltering {
    private static final Logger LOG = Logger.getLogger(LoggingWithMethodFiltering.class);

    public static void unfilteredMethod() {
        LOG.info("I am not filtered");
    }

    public static void filteredMethod() {
        LOG.info("I am filtered and will never appear");
    }

    public static void main(String[] args) {
        unfilteredMethod();
        filteredMethod();
    }
}

log4j.xml:_

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <param name="threshold" value="trace" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p|%-20.20t|%d{HH:mm:ss,SSS}|%20.30c{1} %25.25F:%-4L - %20.20M - %m%n" />
        </layout>
        <filter class="MethodBasedFilter" />
    </appender>

    <root>
        <level value="trace" />
        <appender-ref ref="Console" />
    </root>

</log4j:configuration>
于 2013-02-20T10:35:37.730 に答える
1

私はこれを行う可能性を認識していません。

それでも、クラスとメソッド名を含めるようにロギングを構成し ( PatternLayoutを参照)、ログ ファイルを ' grep' などの他のツールで後処理して、表示したいものを含めたり除外したりできます。

パフォーマンスの問題のため、クラス名とメソッド名をログに記録することはお勧めしませんが、これは関係ないかもしれません。

于 2013-02-20T10:13:52.803 に答える