Q3:すべての public メソッド呼び出しをログに記録するには?

以下のようなアスペクトを作成します。pointcut ですべての public メソッドが実行されるようにしています。呼び出されたメソッドの情報は thisJoinPoint で取得できます。

package logtest.aop.aspect;

import org.apache.log4j.*;

aspect MethodTraceForAll {
        
        private static final Logger logger = 
        Logger.getLogger("logtest.aop.aspect.MethodTraceForAll");
        pointcut methodTrace(): execution(public * *.*(..));

        before(): methodTrace() {
                logger.debug("entering:" + thisJoinPoint);
        }
        after() returning: methodTrace() {
                logger.debug("exiting:" + thisJoinPoint);
        }
}

以下の log4j のアペンダによって、

  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File"   value="C:/log/example.log" />
    <param name="Append" value="false" />
    <param name="MaxFileSize" value="1MB"/>
    <param name="MaxBackupIndex" value="10"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%-5p - %m%n"/>
    </layout>
  </appender>

次のクラスを実行すると、

package logtest.aop;

public class Test1 {
    public Test1() {
        String param1 = "param1";
        int param2 = 2;
        int param3 = 3;
        int[] param4 = { 1, 2, 3 };
        Custom param5 = new Custom();
        test1(param1);
        test2(param2);
        test3(param2, param3);
        test4(param4);
        test5(param5);
        test6();
        test7();
        test8();
        test9();
        test10();
    }

    public void test1(String a) {
    }

    public void test2(int a) {
    }

    public void test3(int a, int b) {
    }

    public void test4(int[] a) {
    }

    public void test5(Custom a) {
    }

    public int test6() {
        return 0;
    }

    public String test7() {
        return "test7";
    }

    public String[] test8() {
        return new String[] { "aaa", "bbb", "ccc" };
    }

    public String test9() {
        return null;
    }

    private void test10() {
    }
}

以下のログが出力されます。

DEBUG - entering:execution(void logtest.aop.Main.main(String[]))
DEBUG - entering:execution(void logtest.aop.Test1.test1(String))
DEBUG - exiting:execution(void logtest.aop.Test1.test1(String))
DEBUG - entering:execution(void logtest.aop.Test1.test2(int))
DEBUG - exiting:execution(void logtest.aop.Test1.test2(int))
DEBUG - entering:execution(void logtest.aop.Test1.test3(int, int))
DEBUG - exiting:execution(void logtest.aop.Test1.test3(int, int))
DEBUG - entering:execution(void logtest.aop.Test1.test4(int[]))
DEBUG - exiting:execution(void logtest.aop.Test1.test4(int[]))
DEBUG - entering:execution(void logtest.aop.Test1.test5(Custom))
DEBUG - exiting:execution(void logtest.aop.Test1.test5(Custom))
DEBUG - entering:execution(int logtest.aop.Test1.test6())
DEBUG - exiting:execution(int logtest.aop.Test1.test6())
DEBUG - entering:execution(String logtest.aop.Test1.test7())
DEBUG - exiting:execution(String logtest.aop.Test1.test7())
DEBUG - entering:execution(String[] logtest.aop.Test1.test8())
DEBUG - exiting:execution(String[] logtest.aop.Test1.test8())
DEBUG - entering:execution(String logtest.aop.Test1.test9())
DEBUG - exiting:execution(String logtest.aop.Test1.test9())
DEBUG - exiting:execution(void logtest.aop.Main.main(String[]))

トップページへ戻る