3

@AroundInvoke でアノテーションが付けられたメソッドを使用して Interceptor を作成し、メソッド呼び出しと関連するタイミングをログに記録しました。これは、CDI AOP http://java.dzone.com/articles/cdi-aop)に関する Richard Hightower の優れたブログ投稿に基づいています。

@AroundInvoke
public Object log(InvocationContext ctx) throws Exception {
    Logger logger = Logger.getLogger(ctx.getTarget().getClass().getName());

    logger.trace("ENTERING : "+ctx.getMethod());

    long start = System.currentTimeMillis();

    Object returnMe = ctx.proceed();

    long executionTime = System.currentTimeMillis() - start;

    logger.trace("EXITING : "+ctx.getMethod()+":"+executionTime+"ms");

    return returnMe;
}

ユーザーのセッション ID をログに記録して、アプリケーション内のユーザー パスを簡単に分析できるようにしたいと考えています。ユーザーのセッションを取得するにはどうすればよいですか?

SessionContext の注入を調べましたが、API を使用してこの値を抽出する方法がわかりませんでした。

log4j MDC を見てきましたが、サーブレット フィルターを追加する必要がないようにしたいと考えていました。

4

1 に答える 1

3

本当に私の質問は、「アプリケーションを介した特定のユーザーパスをログファイルから簡単に解析できるように、メソッド呼び出しをログに記録するにはどうすればよいですか?」でした。現状の質問は、セッションIDを取得することが答えであると想定していますが、そうではない可能性があります。このより良い表現の質問を念頭に置いて、関心のあるすべてのビジネス ロジックが EJB 経由でアクセスされる限り、次のように特定のユーザー パスを実際にログに記録できることを発見しました。

EJB SessionContext が注入されたインターセプタ クラスを作成します。

/**
* SessionContext of this EJB; this will be injected by the EJB
* Container because it's marked w/ @Resource
*/
@Resource
private SessionContext context;

呼び出しをインターセプトする、AroundInvoke アノテーションが付けられたメソッドを追加します。

@AroundInvoke
public Object log(InvocationContext ctx) throws Exception {
    String originName = Thread.currentThread().getName();
    String currentUser = context.getCallerPrincipal().getName();
        try{
           String tracingName = currentUser + " " + originName;
           Thread.currentThread().setName(tracingName);
           return ctx.proceed();
        }finally{
            Thread.currentThread().setName(originName);
        }
    }

セッションコンテキストを使用して、このアクションを引き起こしたユーザーを把握していることに注意してください。次に、そのユーザー名を保持するようにスレッドの名前を変更します。このコール スタックの後続のすべてのロギングでは、loggin が EJB または POJO クラスにあるかどうかに関係なく、スレッド名も出力するように構成されていると仮定して、ユーザー名が出力されます。

このスレッドの名前変更は、Adam Bien のサーバーに依存しないスレッド追跡ユーティリティに触発されました。

http://www.adam-bien.com/roller/abien/entry/server_independent_thread_tracking_utility

スレッドの名前をユーザー名に変更するように変更することは、私が行った変更です。

于 2012-11-24T18:31:46.010 に答える