如何为Spring Boot微服务配置Sleuth对接AWS CloudWatch追踪日志
实现Spring Boot微服务Sleuth+AWS CloudWatch日志追踪的三种方式
方式一:原生集成Sleuth + AWS CloudWatch Logs SDK
适合需要自定义日志发送逻辑、完全掌控上传流程的场景。
- 添加依赖
在pom.xml中引入Spring Cloud Sleuth和AWS CloudWatch Logs SDK:
- 添加依赖
<dependencies> <!-- Spring Cloud Sleuth --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <!-- AWS CloudWatch Logs SDK --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>cloudwatchlogs</artifactId> </dependency> <!-- AWS SDK自动配置 --> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-starter-aws</artifactId> </dependency> </dependencies>
- 配置Sleuth基础参数
在application.yml中开启Sleuth并设置采样率:
- 配置Sleuth基础参数
spring: cloud: sleuth: sampler: probability: 1.0 # 全量采样,生产环境可根据需求调整
- 实现CloudWatch日志发送逻辑
创建配置类初始化CloudWatch客户端,编写日志工具类从MDC中获取Sleuth生成的traceId并嵌入日志事件:
- 实现CloudWatch日志发送逻辑
@Configuration public class CloudWatchConfig { @Bean public CloudWatchLogsClient cloudWatchLogsClient() { return CloudWatchLogsClient.create(); } } @Component public class CloudWatchLogger { private final CloudWatchLogsClient logsClient; private final String logGroupName = "your-service-log-group"; private final String logStreamName = "your-service-log-stream"; @Autowired public CloudWatchLogger(CloudWatchLogsClient logsClient) { this.logsClient = logsClient; } public void log(String message) { String traceId = MDC.get("traceId"); String logMessage = String.format("[traceId: %s] %s", traceId, message); InputLogEvent logEvent = InputLogEvent.builder() .message(logMessage) .timestamp(Instant.now().toEpochMilli()) .build(); PutLogEventsRequest request = PutLogEventsRequest.builder() .logGroupName(logGroupName) .logStreamName(logStreamName) .logEvents(logEvent) .build(); logsClient.putLogEvents(request); } }
- 业务中使用自定义日志工具
在业务代码中注入CloudWatchLogger,直接调用日志方法即可,日志会自动携带traceId。
- 业务中使用自定义日志工具
方式二:Sleuth + Logback/Log4j2 CloudWatch Appender
更简洁的方案,通过日志框架的Appender直接推送日志到CloudWatch,无需手动编写SDK调用逻辑。
以Logback为例:
- 添加依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>com.github.mgurov</groupId> <artifactId>logback-cloudwatch-appender</artifactId> <version>1.7</version> </dependency> </dependencies>
- 配置Logback Appender
在src/main/resources/logback-spring.xml中配置CloudWatch Appender,确保日志格式包含Sleuth的traceId:
- 配置Logback Appender
<configuration> <appender name="CLOUDWATCH" class="com.github.mgurov.logback.cloudwatch.CloudWatchAppender"> <logGroupName>your-service-log-group</logGroupName> <logStreamName>your-service-log-stream</logStreamName> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [traceId: %X{traceId}] - %msg%n</pattern> </layout> </appender> <root level="INFO"> <appender-ref ref="CLOUDWATCH"/> </root> </configuration>
- 验证日志
启动服务后,日志会自动通过Appender发送到CloudWatch,每条日志都会携带traceId,可在CloudWatch控制台通过traceId关键词过滤查询全链路日志。
- 验证日志
方式三:OpenTelemetry替代Sleuth + AWS CloudWatch
由于Spring Cloud Sleuth已进入维护模式,官方推荐使用OpenTelemetry作为替代方案,兼容Sleuth的追踪能力,同时更好地支持CloudWatch生态。
- 添加依赖
替换Sleuth为OpenTelemetry的Spring Boot Starter和CloudWatch Exporter:
- 添加依赖
<dependencies> <!-- OpenTelemetry Spring Boot Starter --> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-spring-boot-starter</artifactId> <version>1.32.0</version> </dependency> <!-- AWS CloudWatch Exporter --> <dependency> <groupId>io.opentelemetry.contrib</groupId> <artifactId>opentelemetry-aws-cloudwatch-exporter</artifactId> <version>1.32.0-alpha</version> </dependency> </dependencies>
- 配置OTel和CloudWatch
在application.yml中配置追踪导出和日志关联:
- 配置OTel和CloudWatch
opentelemetry: traces: exporter: aws: cloudwatch: log-group-name: your-service-trace-group region: us-east-1 logs: exporter: aws: cloudwatch: log-group-name: your-service-log-group region: us-east-1 resource: attributes: service.name: your-service-name
- 配置日志框架关联Trace ID
以Logback为例,修改日志格式包含OTel的trace_id(与Sleuth的traceId值一致):
- 配置日志框架关联Trace ID
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [traceId: %X{trace_id}] - %msg%n</pattern>
- 验证追踪与日志
启动服务后,OTel会自动生成Trace ID并注入MDC,日志和追踪数据都会同步到CloudWatch,可通过Trace ID在CloudWatch的日志和追踪面板中关联查询全链路请求。
- 验证追踪与日志
内容的提问来源于stack exchange,提问作者Whiteox
相关产品推荐
相关产品推荐

