批量执行日志聚合
日志聚合是把分散在各执行点上的日志集中成可检索、可归档的一套记录。做法分三类:按执行批次落盘到独立目录、通过系统日志转发到中心、由采集代理持续上报。关键设计要求有三点:每行都能定位到主机与执行批次(时间戳、主机名、执行标识);标准输出与标准错误分开收集,否则错误信息会被正常输出淹没;必须有轮转与保留策略和容量告警,因为一次大批量执行产生的日志量足以把磁盘写满。
基本信息
| 组织方式 | 每主机独立文件、按执行批次建目录、集中式日志平台 |
|---|---|
| 必备字段 | 时间戳、主机名、执行标识、阶段、退出码 |
| 分离要求 | 标准输出与标准错误分开保存 |
| 运维要求 | 轮转、压缩、保留期与容量告警 |
典型使用场景
- 批量执行后需要回溯某台主机的具体报错
- 需要按批次归档日志,供事后审计与复盘
- 需要跨主机检索同类错误,判断是否系统性问题
- 需要把执行日志接入监控告警做自动判定
- 需要在有限磁盘上保留足够长的历史
按批次聚合与轮转
按批次聚合与轮转
run_id=$(date +%Y%m%d-%H%M%S) # 每次执行一个批次目录
logdir="/var/log/batch/$run_id"; mkdir -p "$logdir"
while read -r h; do
ssh -n "$h" '/opt/bin/deploy.sh' >"$logdir/$h.out" 2>"$logdir/$h.err" & # 分离输出
wait_n 8 # 控制并发,避免日志同时涌入
done < hosts; wait
printf '%s %s\n' "$run_id" "$logdir" >> /var/log/batch/index.txt # 索引便于定位
find /var/log/batch -maxdepth 1 -type d -mtime +30 -exec rm -rf {} + # 保留 30 天聚合方式对比
| 组织方式 | 优点 | 风险 |
|---|---|---|
| 每主机独立文件 | 定位快,互不干扰 | 文件数量多,必须配套清理策略 |
| 按批次建目录 | 便于整体归档与回放 | 单批次目录体积可能很大 |
| 系统日志转发 | 与其他系统日志统一检索 | 日志量过大时可能被丢弃 |
| 采集代理上报 | 近实时且结构化 | 需在目标端部署与维护代理 |
是否会丢日志取决于配置:系统日志在远端不可达时会缓冲,缓冲写满后按策略丢弃。关键执行日志最好在本地同时保留一份,避免中心故障时证据一并丢失。
没有轮转与容量告警的日志目录会在一次大批量执行中把磁盘写满,进而让服务写不了日志甚至写不了数据文件,把一次变更问题放大成系统故障。