1

我正在尝试使用 AOP 实现日志记录概念,但是在打印日志时,我需要提供自己的方法名称而不是默认方法名称。

更新(基于@glitch 的评论):

  • 我正在使用%M转换说明符来告诉 Logback 在每个日志事件中包含方法名称。

  • 我想为某些日志事件替换 Logback 派生方法名称,特别是;对于我的 AOP 连接点发出的日志事件。

  • 我不想在日志事件的其他地方写下“实际方法名称”;我希望使用的方法名称是正确的,即代表原始方法而不是拦截方法。

4

1 回答 1

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这是不可扩展/不可覆盖的。所以,我认为你的选择是:

  1. 在您自己的代码库中创建一个ch.qos.logback.classic.pattern.MethodOfCallerConverter类,即用您自己的替换 Logback 自己的 MethodOfCallerConverter。您可以使用我上面提供的示例,并且 - 只要您CUSTOM_METHOD_NAME_KEY在调用记录器之前将值放入 M​​DC - 它会做您想要的

  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
    
于 2017-10-20T08:17:25.560 回答