2017-10-19 1 views
0

AOPでロギングの概念を実装しようとしていますが、ログを出力する際に​​、デフォルトではなく独自のメソッド名を与える必要があります。 (@glitchからのコメントに基づいて)ログバックのメソッド名(%M変換指定子)を無効にします

更新

  • 私は、各ログイベントにメソッド名が含まれるようにLogbackを伝えるために%M変換指定子を使用しています。

  • のLogback派生メソッド名を一部返します。ログイベント、spcifically;私のAOPジョインポイントから放出されるログイベントです。

  • ログイベントのどこかに「実際のメソッド名」を書きたくないのですが、メソッド名を使用して正しいものにする、つまり、インターセプトメソッドではなく元のメソッドを表すことが必要です。

+0

あなたが「デフォルト」を参照してください、これはあなたがLogbackは、メソッド名を導出できるように、あなたのlogbackパターンの '%M'変換指定子を使用していることを意味するのでしょうか?すべてのログイベントに対して、または選択したログイベントに対してのみこれを置き換えますか?それは置き換えなければならないのでしょうか、ログメッセージのどこかに書かれた追加のメソッド名で十分でしょうか? – glytching

+0

私は2つの方法でロギングを使用しています。これは、メソッド内での通常のロギングとaspectj AOPによるものです。通常のロギングメソッドの名前は正しく出力されていますが、最終的には出力されます。 '' Logger logger = LoggerFactory.getLogger(pjp.getSignature()。getDeclaringTypeName()); \t logger.info(AppConstants.METHOD_START_DEBUG_MSG); '正確なメソッドの代わりにaopメソッドを出力するこのロガーは、' ProceedingJoinPoint'を使用しています –

+0

ここでは、pjp.getSignature()。getName()で正確なメソッド名を取得できます。このメソッド名の代わりにこのメソッド名を表示する必要があります。これが可能でない場合は、%Mをこのメソッド名でオーバーライドすることができます –

答えて

1

%M変換指定子はch.qos.logback.classic.pattern.MethodOfCallerConverterで実装されています。実装は非常に簡単です:

public String convert(ILoggingEvent le) { 
    StackTraceElement[] cda = le.getCallerData(); 
    if (cda != null && cda.length > 0) { 
     return cda[0].getMethodName(); 
    } else { 
     return CallerData.NA; 
    } 
} 

だから、あなたが独自の実装を提供することができます。 MDCを使用して、おそらくこのような何か...

public class CustomMethodOfCallerConverter extends ClassicConverter { 

    public String convert(ILoggingEvent le) { 
     StackTraceElement[] cda = le.getCallerData(); 
     if (cda != null && cda.length > 0) { 
      if (le.getMDCPropertyMap().containsKey("CUSTOM_METHOD_NAME_KEY")) { 
       String methodName = le.getMDCPropertyMap().get("CUSTOM_METHOD_NAME_KEY"); 
       // remove the MDC entry since we are only using MDC to pass the custom method name into this converter 
       le.getMDCPropertyMap().remove("CUSTOM_METHOD_NAME_KEY"); 
       return methodName; 
      } else { 
       return cda[0].getMethodName(); 
      } 
     } else { 
      return CallerData.NA; 
     } 
    } 
} 

は...あなたのジョインポイントから実際のメソッド名を渡すことができます。ジョインポイントでは、ロガーに呼び出す前にMDC値を設定します。

MDC.put("CUSTOM_METHOD_NAME_KEY", pjp.getSignature().getName())); 

しかし、Logbackでは独自のカスタムコンバータを宣言することはできません。 Logbackで使用されているコンバータは、静的イニシャライザで ch.qos.logback.classic.PatternLayoutに宣言されていますが、これは拡張/無効化できません。

  1. はすなわち、あなた自身でLogback自身MethodOfCallerConverterを置き換える独自のコードベースでch.qos.logback.classic.pattern.MethodOfCallerConverterクラスを作成します。だから、私はあなたのオプションがあると思います。限り、あなたはロガーに呼び出す前に、MDCでCUSTOM_METHOD_NAME_KEY値を入れて - - それはあなたが

  2. %M指定子を使用し続けてやりたいだろうが、AOPのためのメソッドが追加傍受私は上記の提供と例を使用することができます追加のMDC属性を使用して実際のメソッド名を表示します。これにより、すべてのログ出力にLogbackメソッド名が表示され、actulaメソッド名も表示されます(利用可能な場合)。たとえば:

    // put the actual method name in MDC 
    MDC.put("actualMethodName", pjp.getSignature().getName()); 
    
    // specify your pattern - in logback.xml - to include the actual method name 
    %d{yyyy-MM-dd HH:mm:ss}|[%thread]|%-5level|%logger{36}|%M%X{actualMethodName:-}|%msg%n 
    
  3. 停止%M指定子を使用し、MDCを経由して、すべてのメソッド名をログに記録します。これにより、正しいメソッド名が表示されますが、すべてのメソッドでMDCを更新する必要があります(これはかなり面倒です)。たとえば:

    // put the actual method name in MDC 
    MDC.put("actualMethodName", pjp.getSignature().getName()); 
    
    // specify your pattern - in logback.xml - to include the actual method name 
    %d{yyyy-MM-dd HH:mm:ss}|[%thread]|%-5level|%logger{36}|%X{actualMethodName}|%msg%n 
    
+0

天才であり、感謝の気持ちになりました。 –

+0

Logbackはあなた自身の '%M'変換指定子を登録するためのフックを提供しないので、 'MethodOfCallerConverter'を模倣してログバックします。このアプローチは機能しますが、それは非標準的であり、脆い可能性があります。 Logbackの今後のバージョンで 'MethodOfCallerConverter'の名前または名前空間が変更された場合は、' MethodOfCallerConverter'のバージョンも変更する必要があります。心に留めるだけのこと.... – glytching

関連する問題