%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
に宣言されていますが、これは拡張/無効化できません。
はすなわち、あなた自身でLogback自身MethodOfCallerConverterを置き換える独自のコードベースでch.qos.logback.classic.pattern.MethodOfCallerConverter
クラスを作成します。だから、私はあなたのオプションがあると思います。限り、あなたはロガーに呼び出す前に、MDCでCUSTOM_METHOD_NAME_KEY
値を入れて - - それはあなたが
が%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
停止%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
あなたが「デフォルト」を参照してください、これはあなたがLogbackは、メソッド名を導出できるように、あなたのlogbackパターンの '%M'変換指定子を使用していることを意味するのでしょうか?すべてのログイベントに対して、または選択したログイベントに対してのみこれを置き換えますか?それは置き換えなければならないのでしょうか、ログメッセージのどこかに書かれた追加のメソッド名で十分でしょうか? – glytching
私は2つの方法でロギングを使用しています。これは、メソッド内での通常のロギングとaspectj AOPによるものです。通常のロギングメソッドの名前は正しく出力されていますが、最終的には出力されます。 '' Logger logger = LoggerFactory.getLogger(pjp.getSignature()。getDeclaringTypeName()); \t logger.info(AppConstants.METHOD_START_DEBUG_MSG); '正確なメソッドの代わりにaopメソッドを出力するこのロガーは、' ProceedingJoinPoint'を使用しています –
ここでは、pjp.getSignature()。getName()で正確なメソッド名を取得できます。このメソッド名の代わりにこのメソッド名を表示する必要があります。これが可能でない場合は、%Mをこのメソッド名でオーバーライドすることができます –