私は一般的にAspectJとAOPのかなり新しいです。 AspectJには、メソッドが呼び出される前、呼び出された後、返された後、例外がスローされた時など、多くのアノテーション(After、AfterReturningなど)があることがわかります。それはかなり典型的な使用例であるロギングのためです。私はこの記事を見てきました。私はそれが私が必要とするものの大部分だと思います。これはAspectJと "jcambi aspect"を使ってロギングを実行します。AspectJを使用してさまざまなデータを条件付きでログに記録する方法
しかし、私は、次のような何かをしたいと思います:
public void login(User user) {
String userType = user.getType();
if (!user.isActive()) {
// point cut 1 -- log inactive user
} else if (!user.isPasswordValid()) {
// point cut 2 -- log wrong password
} else {
// point cut 3 -- log successful login
}
}
我々が確立ログフォーマットを持っています。何かのように:
<actor>|<action_code>|<error_code>|<extra_info>
すべてのアクタータイプ、アクションおよびエラーコードは列挙型に含まれています。何が起こったかに応じて、「IFSの内
ログ、および ログ異なる情報:
にAspectJのを指示する方法はありますか?例えば、点1つのログ次のいずれかの切断:
admin|login|001|Admin user inactive
user|login|001|Normal user inactive
を...点で2ログ次のいずれかの切断:
admin|login|002|Invalid Admin password
user|login|002|Invalid normal user password
を...点で3ログを切断次のいずれか:
admin|login|000|Successful Admin login
user|login|000|Successful Normal user login
何かが私にはありません。または少なくとも簡単ではない。しかし、試行する価値があるかどうかはわかりません。だから私は破れている。一方では、すべてのロギングのコードを「サニタイズ」したいと思います。一方、これを実装するにはあまりにも多くの作業が必要かどうかはわかりません。
アイデア?
*************************************** EDIT ****** *********************************
は、両方のあなたの答えをありがとう!私は今、二つのことを理解しています:1.私は、私の前に多くの仕事を持っています。そして、私は "ログイン"の例をあまり重視しないと思います。
ログインはただ一つの小さなユースケースです。私の仕事は、多くの、多くのクラスのメソッドの束に...どこでもログを追加することです。基本的にどこでもアプリケーションのどこにでもLOG.debug()やLOG.info()があり、Aspectのログに置き換えられます。これはまた、私が望むだけで、私の人生を楽にするためにすべてのコードをリファクタリングすることはできません。私はログインが例外を使用するようにしたいと思うが、私の仕事の範囲を超えている:ロギングを追加する。
そしてもちろん、それぞれの方法でビジネスロジックは異なる、そのようになりますので、ログはなります。だから私の質問になる:これを行うベストプラクティスは何ですか?つまり、それぞれの方法は独自のロジックとif if ...を持ち、条件付きで別のものを記録します。だから私は先に進み、これらのユースケースのそれぞれについてアスペクトクラスを作成し、基本的にそこに同じ "ifs"を持っていますか?
例(つまり、ログインできませんよ!):データをインポートする方法。
public void import(String type) {
if (type.equals("people")) {
try {
int result = importPeople();
if (result > 0) {
// do some stuff
LOG.info("ok");
} else {
// do some stuff
LOG.info("problem");
}
} catch (Exception e) {
// do some stuff
LOG.debug("exception ...");
}
} else if (type.equals("places")) {
try {
int result = importPlaces();
if (result > 0) {
// do some stuff
LOG.info("ok");
} else {
// do some stuff
LOG.info("problem");
}
} catch (Exception e) {
// do some stuff
LOG.debug("exception ...");
}
}
}
繰り返しコードなどがありますが、あなたは考えが分かります。また、このメソッドをログに記録するために、 "import"アスペクトを作成する必要があります...付随するすべての "ifs"を "ok"、 "problem"、 "exception"をログに記録しますか?そして、の場合はすべてユースケースですか?
私はすべて侵入型のロギングコードを取り除いていますが、元のメソッドの両方でロジックを持たなければならないというコードの匂いのようです。この方法は、ログよりも多くのことをやっている)と対応するAspect ...
とにかく、あなたはどちらも私の元の質問に答えました...しかし、私はであることができます。答えです。彼はロットをそれに入れたように思われるので、kriegaexを受け入れるつもりです!
申し訳ありません、記事へのリンクを忘れました: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html –