使用Spring Cloud Sleuth的Spring AOP记录器跟踪ID?

时间:2019-01-31 09:54:23

标签: java logging aop spring-aop spring-cloud-sleuth

我有一些使用Spring Cloud Sleuth作为分布式日志记录管理器运行的微服务。对于某些微服务,还包括Spring AOP,主要包含@Around建议,用于方法执行时间记录(以下代码)。

现在,我可能在这里缺少AOP点,并不太了解何时开始实施@Around通知,但是是否有可能在从@Aspect生成的日志中定义Sleuth跟踪ID类?

代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}

@Aspect类(从org.aspectjorg.slf4j导入):

@Aspect
@Component
public class PerformanceAspect {

private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class);

@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    final long start = System.currentTimeMillis();

    final Object proceed = joinPoint.proceed();

    final long executionTime = System.currentTimeMillis() - start;

    logger.debug("\n---- Performance aspect ----\n" +
                "method: {}\n" +
                "execution time: {} [ms]\n" +
                "------------------------\n",
            joinPoint.getSignature().getName(), executionTime);

    return proceed;
    }
} 

Spring Boot版本是2.0.7.RELEASE(Spring Cloud Finchley.SR2),相关的(Maven)依赖项是:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

@LogExecutionTime是在一些时间紧迫的方法上设置的(文件上传到存储,外部API调用等),如果还可以为方法性能日志记录设置用户操作跟踪ID,则是非常可取的。

感谢您的帮助,谢谢。

更新:

还有其他日志的跟踪ID,例如:

January 31st 2019, 09:44:31.024 dev-backend customer-service    31.01.2019 08:44:50 DEBUG [customer-service,f9c173ae7a161cd6,f9c173ae7a161cd6,false] Request for file upload.

紧接着,这是性能日志(无跟踪ID):

January 31st 2019, 09:44:50.532 dev-backend customer-service    method: fileUploadAzure

January 31st 2019, 09:44:50.532 dev-backend customer-service    ---- Performance aspect ----

January 31st 2019, 09:44:50.532 dev-backend customer-service    execution time: 19507 [ms]

两种情况下的进口均为:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

从配置中记录模式:

logging:
  // other config
  pattern:
    console: "%d{dd.MM.yyyy HH:mm:ss} ${LOG_LEVEL_PATTERN:-%5p} %m%n"

1 个答案:

答案 0 :(得分:0)

解决方案:如果要使用Kibana分析所有行并查看每行的跟踪ID,请不要在日志(\n)中使用行分隔符。