我正在尝试使用 AOP 实现日志记录概念,但是在打印日志时,我需要提供自己的方法名称而不是默认方法名称。
更新(基于@glitch 的评论):
我正在使用
%M
转换说明符来告诉 Logback 在每个日志事件中包含方法名称。我想为某些日志事件替换 Logback 派生方法名称,特别是;对于我的 AOP 连接点发出的日志事件。
我不想在日志事件的其他地方写下“实际方法名称”;我希望使用的方法名称是正确的,即代表原始方法而不是拦截方法。
我正在尝试使用 AOP 实现日志记录概念,但是在打印日志时,我需要提供自己的方法名称而不是默认方法名称。
更新(基于@glitch 的评论):
我正在使用%M
转换说明符来告诉 Logback 在每个日志事件中包含方法名称。
我想为某些日志事件替换 Logback 派生方法名称,特别是;对于我的 AOP 连接点发出的日志事件。
我不想在日志事件的其他地方写下“实际方法名称”;我希望使用的方法名称是正确的,即代表原始方法而不是拦截方法。
%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