◇伺いたいこと
ログをファイルに出力すると、行が重複して出力されます。
原因や懸念点など、お気づきのことがあれば教えてください。
理想は行1,2,4,6のみ出力したいです。
行1:2016-02-15 13:21:07.578 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassA#Method_A start 行2:2016-02-15 13:21:07.606 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassB#Method_B start 行3:2016-02-15 13:21:07.606 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:26) : ClassB#Method_B start 行4:2016-02-15 13:21:07.608 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassB#Method_B end 行5:2016-02-15 13:21:07.608 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassB#Method_B end 行6:2016-02-15 13:21:07.636 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassA#Method_A end 行7:2016-02-15 13:21:07.636 [INFO] [116] LoggedInterceptor.logEntry (LoggedInterceptor.java:33) : ClassA#Method_A end
◇やりたいこと
参考ブログ
メソッドにアノテーションを付与してメソッドの開始と終了ログを記録したい。
logメソッドを直接呼びたくない理由はログ内容を実装者に依存せず、ミスを防ぐこと。
◇できていること
標準出力には想定の結果が表示されます
ClassA#Method_A start ClassB#Method_B start ClassB#Method_B end ClassA#Method_A end
◇環境
java1.8
EE7
JSF2.2
GlassFish4.1
ログ出力にJUL(java.util.logging.Logger)
◇コード
(アノテーション定義)
Java
1import java.lang.annotation.ElementType; 2import java.lang.annotation.Inherited; 3import java.lang.annotation.Retention; 4import java.lang.annotation.RetentionPolicy; 5import java.lang.annotation.Target; 6import javax.interceptor.InterceptorBinding; 7@Inherited 8@InterceptorBinding 9@Retention(RetentionPolicy.RUNTIME) 10@Target({ElementType.METHOD, ElementType.TYPE}) 11public @interface Logged { 12 13}
(アノテーション実装)
Java
1import cs.base.annotations.Logged; 2import java.io.Serializable; 3import java.util.logging.Level; 4import java.util.logging.Logger; 5import javax.annotation.Priority; 6import javax.inject.Inject; 7import javax.interceptor.AroundInvoke; 8import javax.interceptor.Interceptor; 9import javax.interceptor.InvocationContext; 10 11@Priority(Interceptor.Priority.LIBRARY_BEFORE) 12@Interceptor 13@Logged 14public class LoggedInterceptor implements Serializable{ 15 16 @Inject transient Logger logger; 17 18 @AroundInvoke 19 public Object logEntry(InvocationContext ic) throws Exception { 20 21 logger.log(Level.INFO, ic.getMethod().getDeclaringClass().getName() 22 + "#" 23 + ic.getMethod().getName() 24 + " start"); 25 Object obj = ic.proceed(); 26 logger.log(Level.INFO, ic.getMethod().getDeclaringClass().getName() 27 + "#" 28 + ic.getMethod().getName() 29 + " end"); 30 return obj; 31 } 32 33} 34
(呼び出しクラス)
Java
1@SessionScoped 2@Named 3public class ClassA implements Serializable{ 4 @EJB ClassB classB; 5 6 @Logged 7 public String Method_A() throws Throwable{ 8 classB.Method_B(); 9 } 10} 11 12@Stateless 13public class ClassB implements Serializable{ 14 @Logged 15 public void Method_B(){ 16 } 17}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。