Spring AOP 记录器跟踪 ID 与 Spring Cloud Sleuth?
Spring AOP logger trace ID with Spring Cloud Sleuth?
我有一些微服务 运行 Spring Cloud Sleuth 作为分布式日志记录管理器。对于某些微服务,还包括 Spring AOP,主要是 @Around
对方法执行时间记录的建议(代码如下)。
现在,我可能在这里遗漏了 AOP 点并且并不真正理解 @Around
建议何时真正开始,但是是否可以将 Sleuth 跟踪 ID 包含在从 [=21= 生成的日志中] 定义 class ?
代码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
@Aspect
class(从 org.aspectj
和 org.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 引导版本是 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也可以是非常可取的为方法性能日志设置。
感谢任何帮助,谢谢。
更新:
还有其他日志的trace 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"
解决方案:如果您想使用 Kibana 分析所有行并查看每一行的跟踪 ID,请不要在日志中使用行分隔符 (\n
)。
我有一些微服务 运行 Spring Cloud Sleuth 作为分布式日志记录管理器。对于某些微服务,还包括 Spring AOP,主要是 @Around
对方法执行时间记录的建议(代码如下)。
现在,我可能在这里遗漏了 AOP 点并且并不真正理解 @Around
建议何时真正开始,但是是否可以将 Sleuth 跟踪 ID 包含在从 [=21= 生成的日志中] 定义 class ?
代码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
@Aspect
class(从 org.aspectj
和 org.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 引导版本是 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也可以是非常可取的为方法性能日志设置。
感谢任何帮助,谢谢。
更新:
还有其他日志的trace 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"
解决方案:如果您想使用 Kibana 分析所有行并查看每一行的跟踪 ID,请不要在日志中使用行分隔符 (\n
)。