ログ用Interceptorを作る
SpringにはDebugInterceptorやらSimpleTraceInterceptorといったものが
用意されてるけど、ログはオレオレフォーマットが好きなので、無駄に
拡張して作ってみる。
作るもの
- MethodInterceptorを実装したクラス
- 上記Interceptorを設定した設定ファイル
- MethodInterceptorを実装したクラス
- めんどいのでAbstractTraceInterceptorを継承して作る。
- そうするとisLogEnabledをオーバーライドしないといけない・・という罠に1時間くらいはまるお約束。デフォだとtraceレベルが有効でないとログが出ない。
- さらにめんどいので、とりあえずメッセージはあまり変えてない。
- めんどいのでAbstractTraceInterceptorを継承して作る。
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を使う・・・みたいだけど違いがわからん。
- アノテーションベースで作る方法もあるようだけど、こっちの方が個人的に好きなので試してない。