当前位置: 首页 > 知识库问答 >
问题:

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

杜俊逸
2023-03-14

我有一些微服务作为分布式日志管理器与Spring Cloud Sleuth一起运行。对于一些微服务,还包括Spring AOP,主要是关于方法执行时间日志的建议(下面的代码)。

现在,我可能在这里错过了AOP点,并且不太明白@各地建议何时真正生效,但是否有可能将Sleuth跟踪ID包含在从@Aspect定义的类生成的日志中?

代码:

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

方面类(从组织aspectj和组织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>

在一些时间关键的方法(文件上载到存储器、外部API调用等)上设置了日志执行时间(LogExecutionTime),如果还可以为方法性能日志设置用户操作跟踪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个答案

吕霍英
2023-03-14

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

 类似资料:
  • 我希望通过使用一个新表来存储一个日志,其中记录了在每次更新/插入中进行更改的用户、日期以及任何更改的内容,从而实现对我的一个模型实体的历史记录跟踪/审核。 我使用EclipseLink作为我的JPA提供者,但我不想使用它的历史策略,因为提供者将来可能会改变。出于同样的原因,我不能使用Hibernate Envers。 我研究了SpringData提供的审计支持,但它似乎非常基本,它只允许您存储创建

  • 我正在使用Apache Camel,并试图创建一个工作流中每个消息处理历史的日志。 对于简单的直通工作流,即消息传入,经过几个步骤处理,然后离开,这可以简单到只保留交换的顺序日志。我可以通过编写一个自定义的TraceEventHandler来实现这一点,它在每次交换时都被调用,并允许我进行日志记录。 谢了。

  • 问题内容: 是否有一个Logger可以轻松记录我的堆栈跟踪记录(我得到了什么 )?我搜索了log4j文档,但未发现有关记录堆栈跟踪的任何信息。 我可以自己做 但我不想到处重复这段代码。 如果log4j不会为我执行此操作,是否还有另一个日志记录程序包将为我记录stacktrace? 谢谢。 问题答案: 使用log4j可通过以下方式完成: 第一个参数是要显示的消息,第二个参数是记录堆栈跟踪的异常(可抛

  • 问题内容: 有人问我是否可以跟踪MySQL数据库中记录的更改。因此,更改字段后,可以使用旧的还是新的字段以及日期。有没有功能或通用技术可以做到这一点? 如果是这样,我正在考虑做这样的事情。创建一个名为的表。它包含与 主 表相同的字段,但以新旧为前缀,但仅适用于那些实际更改的字段和a 。它将以索引。这样,可以运行报告以显示每个记录的历史记录。这是个好方法吗?谢谢! 问题答案: 真微妙 如果业务要求是

  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。

  • 此任务将展示如何配置 Istio 创建自定义日志条目并且发送给 Fluentd 守护进程。Fluentd 是一个开源的日志收集器, 支持多种数据输出并且有一个可插拔架构。 Elasticsearch是一个流行的后端日志记录程序, Kibana 用于查看。在任务结束后, 一个新的日志流将被加载发送日志到示例 Fluentd/Elasticsearch/Kibana 栈。 在任务中,将使用 BookI