如何配置AWS CloudWatch Agent每日在同一log_group生成新log_stream
实现CloudWatch每日自动创建新Log Stream的方案
问题根源
你之前用{date}作为log_stream_name无效,是因为CloudWatch Agent的{date}变量是Agent启动瞬间的日期,不会随时间动态更新,所以只会在启动当天创建一个Log Stream,后续不会自动切换。要实现每日新Stream,需要结合本地日志轮转+Agent动态监控轮转后的日志文件。
步骤1:配置本地日志按天轮转
首先让PM2生成的日志按天分割,这样每天会产生一个独立的日志文件,CloudWatch Agent才能针对不同日期的文件创建对应Stream。
方案A:用PM2内置日志轮转
修改你的PM2配置文件(比如ecosystem.config.js),添加轮转规则:
module.exports = { apps: [{ name: 'sqsListener', script: '你的启动脚本路径', error_file: '/home/user/listener-logs/out.log', out_file: '/home/user/listener-logs/out.log', merge_logs: true, // 合并正常/错误日志到同一文件,符合你的需求 log_date_format: 'YYYY-MM-DD HH:mm:ss', // 日志时间戳格式 rotate: true, rotate_interval: 'daily', // 每天自动轮转 max_size: '100M', // 可选:单天日志超过100M也轮转 retain: 7 // 本地保留最近7天的日志文件 }] };
重启PM2应用生效:
pm2 reload ecosystem.config.js
方案B:用系统logrotate工具
创建/etc/logrotate.d/sqslistener配置文件:
/home/user/listener-logs/out.log { daily rotate 7 compress missingok notifempty create 0644 user user postrotate pm2 reload sqsListener --update-env > /dev/null 2>&1 || true endscript }
这个配置会每天将out.log重命名为out.log-YYYYMMDD,并生成新的空out.log供PM2写入。
步骤2:修改CloudWatch Agent配置
让Agent监控所有轮转后的日志文件,并以日期文件名作为Log Stream名称:
{ "agent": { "run_as_user": "cwagent" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/home/user/listener-logs/out.log-*", "log_group_class": "STANDARD", "log_group_name": "sqsListener-logs-dev.log", "log_stream_name": "{filename}", // 用轮转后的文件名(含日期)作为Stream名 "retention_in_days": 1, "timestamp_format": "%Y-%m-%d %H:%M:%S" // 匹配PM2的日志时间戳格式,确保时间解析正确 } ] }, "file_fingerprint_lines": 1 // 帮助Agent快速识别新生成的日志文件 } } }
重启CloudWatch Agent生效:
sudo systemctl restart amazon-cloudwatch-agent
验证效果
- 等待第二天,查看CloudWatch的
sqsListener-logs-dev.log日志组,会生成对应日期的新Log Stream(比如out.log-20240520) - 若想立即测试,可以手动触发一次日志轮转,检查Agent是否自动识别新文件并创建Stream
内容的提问来源于stack exchange,提问作者Utkarsh Deep
相关产品推荐
相关产品推荐

