web-dev-qa-db-ja.com

ロギングにSpringAOPを使用するのは良い考えですか?

私は現在Springについて読んでおり、AOPの使用に使用される例の1つは、メソッド呼び出しの開始と終了をログに記録することです。

また、AOPの使用がパフォーマンスに影響を与える可能性があることも読みました。

Spring AOPを使用することは、このタイプのロギングに適していますか?私の理解では、Springは動的AOPを使用しますが、このタイプのAOPには静的AOP(Like AspectJ)を使用する方がよいでしょう。

現在、私が働いている会社のコーディングポリシーでは、ばかげた量のロギングが必要であり、作成する必要のあるロギングコードの量を減らし、コードの可読性を向上させたいと考えています。

私は間違った木を吠えていますか?

31
Omar Kooheji

パフォーマンスの懸念について このブログ投稿 を読んでください。

AOPの考え方は、提供された機能上の利点を最初に置くことです。自動ロギングが要件であり、AOPがそれに適合する場合は、それを選択してください。

とは言うものの、きめ細かいロギングが必要な場合は、もちろん、ロード時のウィービングが推奨されます。

15
Bozho

ロギングの実装にSpringAOPを使用したので、観察結果を共有します。

  • パフォーマンスへの影響は十分ではなく、ロギング自体の影響よりも小さいです。
  • Spring構成でアスペクトを構成すると、必要に応じてロギングコードを完全に無効にすることができます
  • スタックトレースがかなり長くなるにつれて、デバッグはより問題になります
  • このような決定は、設計に十分に影響します。たくさんのインターフェースとアスペクトクラスを取得するだけでなく、プロダクションクラスは非常に「薄い」必要があります。非公開メソッドへの呼び出しを傍受することはできないことを忘れないでください。セルフコール(パブリックメソッドに対しても)も傍受できないため(AOPでラップされたハンドルの代わりに裸のthisハンドルを使用しているため)、ログに記録できません。したがって、すべてのロギングはインターフェース境界でのみ発生する可能性があります。 (これはプロキシベースのアスペクトウィービングの使用に関するもので、cglibを使用したランタイムサブクラス化のオプションがありますが、私はそれを使用しませんでした)
  • ポイントカットを書くのは非常に難しい場合があります。 IntelliJ Ideaは、ポイントカットによってアドバイスされる方法を大いに決定するのに役立ちます。
  • 一般的に、私はこのアプローチが好きで、使用する価値があると思いますが、予想よりもはるかに複雑に見えました
35
Rorick

このブログ投稿 で説明されている方法と同じように行いました。これは私が見つけた最高のものであり、AOPを使用する場合と使用しない場合の違いをうまく示す sample もあります。

永続性を備えたエラー管理のように、もっと凝ったことをしてからログを記録しない限り、それは価値がありません。適切な例外階層(ドメイン、システム)があり、ロギング境界を適切に設定している場合、ロギングコードを大幅に削減することはできません。

3
lisak