log4j では、オブジェクトごとではなく、カテゴリごとに logger オブジェクトが必要になります。一般に、コントローラー、サービス、daos などはシングルトンであることが多いため、それぞれにロガー オブジェクトをインスタンス変数として含めることは問題ありません。あなたは次のようなものを書くでしょう
public void MyServiceImpl implements MyService {
private Logger logger = Logger.getLogger(getClass());
....
}
すべてが独自のロガー (およびサービスと daos の同上) を必要とする一連のコントローラーがある場合は、その Logger 宣言を抽象ベースコントローラー (サービスと daos の同上) に配置することもできます。これは、保護されたフィールド、または getter を使用したプライベートにすることができますが、ロギング カテゴリが重要であるため、コントローラー (サブ) クラスごとにロガーが必要になります。
もちろん、ロガーが多すぎるのは当然の懸念事項であるため、クラスがシングルトンでない場合は、別のことを行う必要があります。数十または数百のドメイン オブジェクトにロギングを追加する場合、ドメイン オブジェクトごとにロガー オブジェクトを作成する必要はありません。この場合、私はロガーをクラス変数として使用しました (他の人が使用しているのを見ました)。たとえば、次のようになります。
public void MyDomainObject {
private static Logger logger = Logger.getLogger(MyDomainObject.class);
....
}
ロギングの「アーキテクチャ」に関する限り、アプリケーション アーキテクチャに従ってください。アプリケーション アーキテクチャで問題が適切に分離され、すべてが適切に階層化され、クラスとインターフェイスに適切な名前が選択されている場合、ログ構造は従う必要があります。