CustomizableTraceInterceptor
org.springframework.aop.interceptor.CustomizableTraceInterceptorを使うと、任意のフォーマットでトレースログを出力できます。メソッド引数や処理時間を設定だけで出力できるので便利(1.2から)。
こういった感じのログが出力されます。
2007-03-14 16:17:27,446 TRACE [main][my.app.dao.UserDao] - Entering UserDao.insert(User)[id='1', name='ytake', note='備考']
2007-03-14 16:17:27,587 TRACE [main][my.app.dao.UserDao] - Exiting UserDao.insert : return = void : time = 141ms
以下の例は、全ServiceとDaoの全メソッドを対象としてトレースログを出力するための設定です。
traceAdviceの定義
<!-- Trace Advice (Required 'TRACE' Log Level) --> <bean id="traceAdvice" class="org.springframework.aop.interceptor.CustomizableTraceInterceptor"> <property name="useDynamicLogger" value="true"/> <property name="enterMessage" value="Entering $[targetClassShortName].$[methodName]($[argumentTypes])[$[arguments]]" /> <property name="exitMessage" value="Exiting $[targetClassShortName].$[methodName] : return = $[returnValue] : time = $[invocationTime]ms" /> <property name="exceptionMessage" value="Exception thrown in $[targetClassShortName].$[methodName] : $[exception]" /> </bean>
ややこしく見えますが、出力ログのフォーマットを指定してだけです。
value属性に設定している$[xxx]は置換文字列で、例えば$[returnValue]だとメソッドの戻り値がログに出力されます。
以下のような置換文字列が利用できます。
- $[methodName] - メソッド名
- $[targetClassName] - クラス名(パッケージ含む)
- $[targetClassShortName] - クラス名(パッケージ含まない)
- $[returnValue] - 戻り値
- $[argumentTypes] - 引数の型
- $[arguments] - 引数
- $[exception] - 例外
- $[invocationTime] - メソッドの実行時間(ms)
"enterMessage"、"exitMessage"、"exceptionMessage"を指定しない場合は、Springがデフォルトのフォーマットでトレースログを出力します。
PointCutの定義
<aop:config> <!-- PointCut Definition --> <aop:pointcut id="pointcut-dao" expression="execution(* my.app.dao..*Dao.*(..))" /> <aop:pointcut id="pointcut-service" expression="execution(* my.app.service..*Service.*(..))" /> <!-- Trace --> <aop:advisor advice-ref="traceAdvice" pointcut-ref="pointcut-dao" /> <aop:advisor advice-ref="traceAdvice" pointcut-ref="pointcut-service" /> </aop:config>