0

トレースしたいパブリック メソッドが 2 つあります。メソッドの 1 つは、他のメソッドを繰り返し呼び出します。やりたいことは、外部から呼び出されたメソッドだけをトレースすることです。

これは、私が何を意味するかを示す簡単なクラスです。

public class LoggingExample {
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
    public static final String USER_ROOT = "/home/waisbrot";

    /** could be called by fileExistsRobust *or* from outside */
    public static boolean fileExists(String filename) {
        logger.trace("Checking for file {}", filename);
        File f = new File(filename);
        return f.exists();
    }

    /** always gets called from outside */
    public static boolean fileExistsRobust(String filename) {
        logger.trace("Checking for any varient of {}", filename);
        if (fileExists(filename))
            return true;
        for (String prefix : prefixes) { // this list is 100 items long
            if (fileExists(prefix + filename));
                return true;
        }
        return false;
    }
}

私のコードのどこかで を呼び出すかもしれませんfileExists。しかし、私がそのログメッセージがfileExistsRobost欲しいよりも電話をかけた場合、そうではありません。fileExists

両方のメソッドをトレースしたいのですが、2 番目のメソッドを呼び出すと、出力に埋もれてしまいます。私が望むものを理解するようにLogbackを構成できることを望んでいましたが、ドキュメントには何も役に立ちません。入力時にフラグを反転しfileExistsRobustて でテストすることもできfileExistsますが、複数のスレッドがあると見苦しくなります (これらは静的メソッドであるため)。多くのロギング インフラストラクチャでクラスを汚染し始めるようです。MDC を使用して情報を保存することもできますが、それは MDC の悪用のようです。

以前にこの状況に遭遇した人はいますか?どのように対処しましたか?

4

1 に答える 1

1

コードを変更できると思います。私の意見では、最も簡単な方法は、別のものを導入するinternalFileExists(String filename)か、logging togle を使用して fileExists(String filename) をオーバーロードすることにより、問題を回避することです。

public static boolean fileExists(String filename, boolean doLog) {
   if (doLog) logger.trace("Checking for file {}", filename);
   File f = new File(filename);
   return f.exists(); 
}

そして、fileExistsRobust が doLog = false でオーバーロードされたバージョンを使用するようにします。一方、引数が 1 つのバージョンは fileExists(filename, true) にリダイレクトします。

それは実際に問題に対処するわけではありませんが、軽減します。

于 2013-03-17T17:42:44.510 に答える