Shell 多服务器日志采集归档
目标
从多台服务器统一采集业务日志,压缩后归档到 NAS 或集中存储,方便审计、排障和长期留存。
适用场景
- 多台应用服务器需要统一归档日志。
- 日志需要定期压缩,减少磁盘占用。
- 需要将日志同步到 NAS、备份机或集中存储。
- 暂时不引入完整日志平台,但需要基础归档能力。
参数配置
| 参数 | 示例 | 说明 |
|---|---|---|
SERVER_LIST | servers.txt | 服务器列表 |
REMOTE_LOG_DIR | /var/log/myapp | 远端日志目录 |
LOCAL_TMP_DIR | /tmp/log-collect | 本地临时目录 |
ARCHIVE_DIR | /nas/logs | 归档目录 |
RETENTION_DAYS | 30 | 本地归档保留天数 |
核心逻辑
- 读取服务器列表。
- 使用
rsync或scp拉取日志。 - 按服务器和日期组织目录。
- 压缩日志包。
- 移动到 NAS 归档目录。
- 清理过期本地临时文件。
脚本示例
#!/usr/bin/env bash
set -euo pipefail
SERVER_LIST="./servers.txt"
REMOTE_LOG_DIR="/var/log/myapp"
LOCAL_TMP_DIR="/tmp/log-collect"
ARCHIVE_DIR="/nas/logs"
TODAY="$(date '+%Y-%m-%d')"
mkdir -p "$LOCAL_TMP_DIR" "$ARCHIVE_DIR/$TODAY"
while read -r server; do
[ -z "$server" ] && continue
target="$LOCAL_TMP_DIR/$server"
mkdir -p "$target"
rsync -az "$server:$REMOTE_LOG_DIR/" "$target/"
tar -czf "$ARCHIVE_DIR/$TODAY/$server.tar.gz" -C "$LOCAL_TMP_DIR" "$server"
done < "$SERVER_LIST"部署方式
install -m 755 collect_logs.sh /usr/local/bin/collect_logs.sh
install -m 600 servers.txt /etc/log-collect/servers.txt
crontab -e每天凌晨 3 点归档:
0 3 * * * /usr/local/bin/collect_logs.sh验证方法
rsync --version
ssh <server> 'ls -lh /var/log/myapp'
/usr/local/bin/collect_logs.sh
ls -lh /nas/logs/$(date '+%Y-%m-%d')
tar -tzf /nas/logs/$(date '+%Y-%m-%d')/<server>.tar.gz | head确认点:
- 每台服务器都有对应归档包。
- 归档包可以正常解压或列出内容。
- 采集失败有日志记录。
- NAS 空间充足。
风险与回滚
| 风险 | 处理方式 |
|---|---|
| SSH 认证失败 | 使用专用只读账号和密钥 |
| 日志过大导致归档慢 | 分批采集,控制压缩窗口 |
| NAS 空间不足 | 设置容量告警和保留周期 |
| 拉取中断 | 使用 rsync 支持断点续传 |
回滚:
crontab -e
rm -f /usr/local/bin/collect_logs.sh