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を適用するクラスを指定します。

<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>