纯Shell可实现大容量日志按天切分、压缩上传NAS:先用date和mv按昨日日期重命名归档并新建空日志,再tar流式压缩+可选脱敏与sha256校验,接着rsync断点续传至NAS(免密SSH),最后清理本地旧包并校验NAS文件完整性。

大容量日志按天切分、压缩并上传到远程NAS,核心在于:定时触发 + 按日期归档 + 压缩去重 + 安全传输 + 清理控制。不依赖复杂工具,纯 Shell 就能稳稳落地。
按天切分:用 date 和 mv 精准打标
关键不是“切割”,而是“重命名+归档”。假设原始日志是 /var/log/app.log(持续追加),每天零点执行切分:
- 用 date -d 'yesterday' +%Y%m%d 生成昨日日期标签,避免时区或执行延迟导致错日
- mv /var/log/app.log /var/log/app_$(date -d 'yesterday' +%Y%m%d).log
- 立即 touch /var/log/app.log 创建新空文件,确保应用可继续写入(部分程序需 kill -USR1 通知重开日志,视服务而定)
压缩归档:gzip + tar 避免碎片和体积膨胀
单个大日志直接 gzip 压缩率高,但多个小文件打包再压更省空间、易管理:
- 优先用 tar -cf - *.log | gzip > archive_$(date -d 'yesterday' +%Y%m%d).tar.gz —— 流式压缩,不落地临时文件,节省磁盘
- 若日志含敏感字段(如手机号、token),压缩前可用 sed 或 awk 脱敏,例如:sed 's/phone=[0-9]\{11\}/phone=***REDACTED***/g' app_20240520.log | gzip > ...
- 压缩后用 sha256sum 生成校验码,和压缩包一起传,后续可验证完整性
上传NAS:rsync 比 scp 更健壮,支持断点续传
NAS 若支持 SSH,rsync 是首选;若只开放 SMB/CIFS,用 mount + cp(但稳定性略低):
- rsync 示例:rsync -avz --remove-source-files -e "ssh -p 2222" archive_20240520.tar.gz user@nas-ip:/backup/logs/
- --remove-source-files 保证本地压缩包传完即删,防重复上传
- 提前用 ssh-keygen 配好免密登录,NAS端 ~/.ssh/authorized_keys 加入公钥,禁用密码登录提升安全性
- 上传失败时 rsync 自动重试,配合简单 while 循环可增强容错:until rsync ...; do sleep 60; done
清理与监控:留够空间,异常及时告警
不清理 = 磁盘爆满;不监控 = 故障无声:
- 本地保留最近7天压缩包:find /var/log -name "*.tar.gz" -mtime +7 -delete
- NAS端按月建子目录(如 /backup/logs/202405/),上传前用 mkdir -p 创建,避免路径错误
- 脚本末尾加校验逻辑:检查 NAS 上文件大小是否 >0,且 sha256sum 匹配;不匹配则 echo 错误并 mail -s "Log upload failed" admin@example.com
整个流程用 crontab 每日凌晨 00:15 触发一次,脚本开头加 set -e 让任意命令失败即退出,避免静默出错。不复杂但容易忽略细节,稳住节奏比追求炫技更重要。

















