AWS FireLens实例缩容时丢失优雅停机日志问题求助
问题排查与修复方案
核心配置问题分析
1. 停机时长与stopTimeout不匹配
你的Python应用优雅停机逻辑需要150秒,但Dockerrun.aws.json中应用容器和FireLens容器的stopTimeout都设为60秒。ECS会在发送SIGTERM后等待60秒,超时直接强制终止容器,导致:
- 应用未完成优雅停机就被杀死,后续停机日志无法输出
- FireLens容器提前终止,无法收集转发剩余日志
2. FireLens停机日志处理配置不足
虽然指定了minimize-log-loss.conf,但默认配置未针对Loki的HTTP转发特性优化,缺少停机时强制刷新日志的关键逻辑,无法应对Loki请求的延迟情况。
3. 容器停止顺序不合理
FireLens标记为essential: true,ECS停止任务时会给所有容器同时发送SIGTERM,导致应用和FireLens并行进入停机流程,FireLens可能在应用输出完停机日志前就停止运行。
针对性修复方案
1. 对齐停机时长配置
将应用容器和FireLens容器的stopTimeout调整为不小于应用停机时长(建议设为180秒,留足日志转发冗余时间):
{ "name": "log_router", "stopTimeout": 180, // 其他配置不变 }, { "name": "python-ecs-test-app", "stopTimeout": 180, // 其他配置不变 }
2. 自定义FireLens配置强化日志刷新
创建自定义Fluent Bit配置文件(命名为custom-log-loss.conf),添加停机日志保障逻辑:
[SERVICE] Flush 1 Grace 30 Log_Level info [INPUT] Name forward Listen 0.0.0.0 Port 24224 Exit_On_Close On [OUTPUT] Name loki Match * Host loki.example.com Port 443 TLS On Remove_Keys container_id,ecs_task_arn Labels job=firelens Label_Keys $container_name,$ecs_task_definition,$source,$ecs_cluster Flush_On_Shutdown 30 Timeout 10 Buffer_Chunk_Size 1M Buffer_Max_Size 5M
更新Dockerrun.aws.json中的FireLens配置路径:
"config-file-value": "/fluent-bit/configs/custom-log-loss.conf"
3. 调整容器停止依赖顺序
给FireLens添加dependsOn配置,确保应用容器完全停止后,FireLens才进入停机流程:
{ "name": "log_router", "essential": true, "stopTimeout": 180, "dependsOn": [ { "containerName": "python-ecs-test-app", "condition": "STOPPED" } ], // 其他配置不变 }
4. 验证应用日志输出
确认Python应用的print语句输出到stdout,且Dockerfile中已使用python -u参数(你已配置),避免缓冲导致日志延迟输出。
额外验证步骤
- 手动触发ECS任务停止,查看CloudWatch的
firelens-test日志组,检查FireLens是否有转发失败报错 - 查看Loki接收日志,确认是否存在连接超时或拒绝记录
- 本地Docker环境模拟SIGTERM,验证应用停机日志能否正常输出并被收集
内容的提问来源于stack exchange,提问作者lowkey'd
相关产品推荐
相关产品推荐

