Spring AOP / SLF4J / Log4j - 目标方法的日志行号,而不是建议方法

时间:2015-07-22 20:53:57

标签: java spring log4j slf4j spring-aop

在使用Spring AOP记录进入/退出方法时,我无法弄清楚如何记录目标方法的行号。

我试图获取目标方法的行号:

1)使用Spring Aspect

这没有任何帮助,因为每当我尝试访问SourceLocation方法时UnsupportedOperationException总是抛出getLine()

    @Component
    @Aspect
    public class LoggingAspect {

      @Pointcut("execution(* com.xyz..*(..))")
      public void anyMethod() {}

      @Before("anyMethod()")
      public void entryLogging(JoinPoint joinPoint) throws Throwable {
        XLogger logger = XLoggerFactory.getXLogger(joinPoint.getSignature().getDeclaringType());

        Signature methodSignature = joinPoint.getSignature();

        logger.trace("Enter " + methodSignature.getDeclaringType().getCanonicalName() + ":" + methodSignature.getName() + ":" + joinPoint.getSourceLocation().getLine());

      }

     @After
     // excluded for brevity....
   }

2)使用CustomizableTraceInterceptor

这个问题似乎没有获得行号的方法。

    @Configuration
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    @Aspect
    public class TraceLoggerConfig {

      @Pointcut("execution(* com.xyz..*(..))")
      public void anyMethod() {}

      @Bean
      public CustomizableTraceInterceptor customizableTraceInterceptor() {
        CustomizableTraceInterceptor customizableTraceInterceptor = new CustomizableTraceInterceptor();
        customizableTraceInterceptor.setUseDynamicLogger(true);
        customizableTraceInterceptor.setEnterMessage("Entering $[targetClassName]:$[methodName]($[arguments])");
        customizableTraceInterceptor.setExitMessage("Leaving  $[methodName](), returned $[returnValue]");
        return customizableTraceInterceptor;
      }

      @Bean
      public Advisor loggingAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("com.xyz.TraceLoggerConfig.anyMethod()");
        return new DefaultPointcutAdvisor(pointcut, customizableTraceInterceptor());
      }

    }

理想情况下会发生以下情况:

1)我不会更改我的XML配置日志记录格式(目前为[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%C:%M:%L] - %m%n)。这是因为我有其他类型的日志记录语句(除了跟踪),这对于使用这种格式有很大好处。

2)我的日志记录格式将引用目标方法,而不是AOP建议方法。然而 Spring Aop logging line number incorrect让我觉得这不可能通过log4j配置,因为它是log4j的工作方式(使用调用日志记录方法的行号)。

我不介意在我的建议中指定用于记录的自定义格式,我将把行号作为消息log4j的一部分发出。但是当我尝试这样做时,我的记录器忽略了我的自定义格式,并将我的第一个参数记录为我的消息。因此,即使我可以获取目标方法调用的行号,这些跟踪调用的日志格式也会很时髦。

0 个答案:

没有答案