2

次のようなログプロトタイプを備えたサードパーティのソフトウェアライブラリを使用しています。

runtime.getInstance().log(int logtype, String moduleName, String logtext);

ライブラリに依存しないユーティリティライブラリがありますが、自分のクラスからソフトウェアパッケージにログを記録できるようにもしたいと考えています。「あなたは悪いデータを渡しました!」のようなテキストメッセージはかなり普遍的であるため、これは問題なく、良いことです。そして「何とか何とか成功した!」さらに、ソフトウェアベンダーのロギング機能をすでにラップしているので、ランダムなAPIに準拠することさえ心配していません。

私が心配しているのは(なぜこの投稿を書いているのか)、システム全体にさまざまな異なるモジュールが存在することです。したがって、問題は次のようになります。

ModuleFoo extends com.thirdpartyvendor.BaseModule
ModuleBar extends com.thirdpartyvendor.BaseModule

ModuleFoo---のインスタンスが含まれています---> IndependentDataStructure---ログエントリを自分の--->に書き込もうとしますWrappedLoggerが、データ構造にへの参照がありませんModuleFoo

ModuleBar---のインスタンスが含まれています---> IndependentDataStructure---ログエントリを自分の--->に書き込もうとしますWrappedLoggerが、データ構造にへの参照がありませんModuleBar

現在、私のシステムは、String moduleName率直に言って私を病気にするフィールドを通過します...しかし、ログエントリに私のモジュールが何であるかを教えてもらいたいです!ロガーは、 (または)への参照を含まずに、IndependentDataStructureインスタンスが動作してModuleFooいるかどうかModuleBar(または他のモジュール)をどのように知ることができますか?IndependentDataStructureBaseModuleString moduleName

4

2 に答える 2

2

Log4J や SLF4J などのロギング API には、診断コンテキストThreadLocalの概念があります。これは、ログ メッセージ フォーマッタがアクセスしてメッセージを装飾できるマップにさまざまなコンテキスト情報を格納する方法です。これの典型的な用途は、現在認証されているユーザーの名前を Web アプリケーションのログ メッセージに入れることです (リクエストごとにサーブレット フィルターを使用して MDC にユーザー名を保存します)。システム?

于 2012-10-24T12:41:36.487 に答える
0
runtime.getInstance().log(int logtype, 
                          this.getClass().getSimpleName(), 
                          String logtext);

正解したら…

EDIT:および自動化された(ただし少し遅い)自動メソッド名の場合:

Thread.currentThread().getStackTrace()[level].getMethodName();

(ここで、レベルは整数であり、ログ リクエストが渡されるクラスの数を指定します)

于 2012-10-24T12:31:57.893 に答える