在使用Spring AOP记录进入/退出方法时,我无法弄清楚如何记录目标方法的行号。
我试图获取目标方法的行号:
这没有任何帮助,因为每当我尝试访问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....
}
这个问题似乎没有获得行号的方法。
@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的一部分发出。但是当我尝试这样做时,我的记录器忽略了我的自定义格式,并将我的第一个参数记录为我的消息。因此,即使我可以获取目标方法调用的行号,这些跟踪调用的日志格式也会很时髦。