(a) クラスごとに 1 つの Logger インスタンスではなく、アプリケーションごとに 1 つの Logger インスタンスを実装する方法。(b) スタック トレースをカスタマイズして、エラーが発生した行番号とその Java クラス名のみを出力できますか。
ありがとう
(a) クラスごとに 1 つの Logger インスタンスではなく、アプリケーションごとに 1 つの Logger インスタンスを実装する方法。(b) スタック トレースをカスタマイズして、エラーが発生した行番号とその Java クラス名のみを出力できますか。
ありがとう
通常、クラスごとにロガーをセットアップします。これは優れた論理コンポーネントであるためです。スレッドはすでにログ メッセージの一部になっているため (フィルタで表示される場合)、そのようにロガーをスライスするのはおそらく冗長です。
アプリケーションまたはレイヤーベースのロガーに関しては、問題は、そのロガー オブジェクトを貼り付ける場所を見つけなければならないことです。大したことではありません。より大きな問題は、一部のクラスが複数のアプリケーションから複数のレベルで使用される可能性があることです...ロガーを正しく取得するのが難しい場合があります。または、少なくともトリッキーです。
...そして、ログの設定で間違った想定を行うことは、最も避けたいことです。
アプリケーションとレイヤーに関心があり、簡単な分離ポイントがある場合は、NDC が最適です。コードが少し過剰になることもありますが、レイヤー Y のアプリケーション X から Foo.bar() が呼び出されたことを示す正確なコンテキスト スタックによって何回救われたかわかりません。
最もよく使用される戦略は、クラスごとにロガーを作成することです。新しいスレッドを作成する場合は、それらに便利な名前を付けて、それらのログを簡単に区別できるようにします。
クラスごとにロガーを作成すると、クラスのパッケージ構造でログのオン/オフを切り替えることができるという利点があります。
log4j.logger.org.apache = INFO
log4j.logger.com.example = DEBUG
log4j.logger.com.example.verbose = ERROR
上記は、すべてのApacheライブラリコードをレベルに設定し、詳細パッケージを除いて、INFO
独自のコードからレベルにロギングを切り替えます.DEBUG
(a) getLogger() のすべての呼び出しに対して同じカテゴリを定義します。
// Create a logger per class:
static Logger log = Logger.getLogger(MyClass.class);
// Use the same logger for the whole application:
// use this line in all your classes:
static Logger log = Logger.getLogger("YourLogCategory");
HTH。