我正在尝试使用AOP实现日志记录概念,但在打印日志时我需要提供自己的方法名称而不是默认值。
更新(根据@glitch的评论):
我正在使用%M
转换说明符告诉Logback在每个日志事件中包含方法名称。
我想为某些日志事件重新定义Logback派生的方法名称,特别是;对于我的AOP连接点发出的日志事件。
我不想写出实际的方法名称'日志事件中的其他位置;我希望使用方法名称并使其正确,即表示原始方法而不是拦截方法。
答案 0 :(得分:2)
%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;
}
}
因此,可以提供您自己的实现。这样的事也许......
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值,例如
MDC.put("CUSTOM_METHOD_NAME_KEY", pjp.getSignature().getName()));
但是...... Logback没有提供任何方式来声明自己的自定义转换器。 Logback使用的转换器在静态初始化器中声明
ch.qos.logback.classic.PatternLayout
,这不是可扩展/可覆盖的。所以,我认为你的选择是:
在您自己的代码库中创建一个ch.qos.logback.classic.pattern.MethodOfCallerConverter
类,即用您自己的方法替换Logback自己的MethodOfCallerConverter。您可以使用我上面提供的示例 - 只要您在调用记录器之前将CUSTOM_METHOD_NAME_KEY
值放在MDC中 - 它就可以执行您想要的操作
继续使用%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