7

Logback を使用して slf4j をレガシー アプリケーションにレトロフィットしたいと考えています。幸いなことに、レガシー アプリケーションには独自のロギング フレームワークがあります。そのため、log4j ではなく slf4j にログを記録するようにロギング フレームワークを変更するだけで済みました。

それは夢のように働きました。Logback がログイベントごとに記録した場所に気付くまでは、私は満足していました。

Logger.java:...

うわぁ!ログイベントがどこから来たのかを突き止めようとするとき、それは私の仲間の開発者をあまり助けませんでした.

実際にログに記録する場所をスタック内のいくつかのレベルで検索するように Logback に指示するにはどうすればよいですか?

ロガー クラスは、次のようなメソッドを持つユーティリティ クラスです。

public static void debug(String clazz, String message) {
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
    logger.debug(message);
}
4

2 に答える 2

13

のソースを見て解決策を見つけましたjcl-over-slf4j。slf4j のほとんどの実装 (logback を含む) はLocationAwareLogger、 を実装するロガーを使用します。これには、ラッピング ロガー クラスの完全修飾クラス名を引数の 1 つとして期待する log メソッドがあります。

private static final String FQCN = Logger.class.getName();


public static void debug(String clazz, String message) {
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
    if (logger instanceof LocationAwareLogger) {
        ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null);
    } else {
        logger.debug(message);
    }
}
于 2010-08-16T11:47:30.577 に答える
5

それを行う方法については、さまざまなXXX-over-slf4jの実装を参照してください。

基本的に、現在のロガーフレームワークを完全に置き換えたいと考えています。slf4jをラップしないでください。

編集:

別のアプローチは、現在使用しているものをサブクラス化する独自のレイアウトを作成することです。これは、余分なスタックフレームをスキップする%m、%lなどのフィールドの意味が変更されています。

于 2010-08-16T09:13:14.287 に答える