ログ用Interceptorを作る

SpringにはDebugInterceptorやらSimpleTraceInterceptorといったものが
用意されてるけど、ログはオレオレフォーマットが好きなので、無駄に
拡張して作ってみる。


作るもの

  • MethodInterceptorを実装したクラス
  • 上記Interceptorを設定した設定ファイル
  • MethodInterceptorを実装したクラス
    • めんどいのでAbstractTraceInterceptorを継承して作る。
      • そうするとisLogEnabledをオーバーライドしないといけない・・という罠に1時間くらいはまるお約束。デフォだとtraceレベルが有効でないとログが出ない。
    • さらにめんどいので、とりあえずメッセージはあまり変えてない。
public class LogInterceptor extends AbstractTraceInterceptor {

    @Override
    protected Object invokeUnderTrace(MethodInvocation invocation, Log logger) throws Throwable {
        String invocationDescription = getInvocationDescription(invocation);
        logger.info("start " + invocationDescription);
        try {
            Object rval = invocation.proceed();
            logger.info("end " + invocationDescription);
            return rval;
        } catch (Throwable ex) {
            logger.info("error " + invocationDescription, ex);
            throw ex;
        }
    }

    protected String getInvocationDescription(MethodInvocation invocation) {
        return "method '" + invocation.getMethod().getName();
    }

    @Override
    protected boolean isLogEnabled(Log logger) {
        // 強引・・・w
        return true;
    }
}
  • 設定
    • なんということはなく。
    • useDynamicLoggerとすると、そのクラスのカテゴリでログ出力される・・・ってこれって色々と大丈夫なの?
<bean id="traceInterceptor" class="jp.gr.java_conf.ykhr.sptest.LogInterceptor">
    <property name="useDynamicLogger" value="true" />
</bean>
<aop:config>
    <aop:advisor pointcut="execution(* jp.gr.java_conf.ykhr.sptest.*.*(..))"
        advice-ref="traceInterceptor" />
</aop:config>


とりあえずTODO

  • pointcutの指定の詳細は、まだよくわからん。
  • proxy-target-class="true" とするとCGLIBを使う・・・みたいだけど違いがわからん。
  • アノテーションベースで作る方法もあるようだけど、こっちの方が個人的に好きなので試してない。