rsync 日志记录 + logrotate 轮转

举报
bit澜 发表于 2026/10/12 18:03:26 2026/10/12
【摘要】 一、rsync 日志记录 1. 背景rsync 默认不写日志文件,只在终端输出。需要留存记录时有两种方式。 2. 方式一:--log-file(推荐,规范)rsync -av --delete --log-file=/var/log/rsync_push.log \ /data/mirror/ root@host:/data/mirror/每条记录带 时间戳 + 进程 PID,可对应到每...

一、rsync 日志记录

1. 背景

rsync 默认不写日志文件,只在终端输出。需要留存记录时有两种方式。

2. 方式一:--log-file(推荐,规范)

rsync -av --delete --log-file=/var/log/rsync_push.log \
  /data/mirror/ root@host:/data/mirror/

每条记录带 时间戳 + 进程 PID,可对应到每次推送调用。

自定义格式:

rsync -av --log-file=/var/log/rsync_push.log \
  --log-file-format='%t %o %i %b %n' \
  /data/mirror/ root@host:/data/mirror/

常用占位符:

占位符 含义
%t 时间
%o 操作类型(send/deliver)
%i 变更类型(新增/更新/删除)
%n 文件名
%b 传输字节数
%f 完整路径
%a 对端 IP
%p PID

3. 方式二:输出重定向(简单)

rsync -av --delete /data/mirror/ root@host:/data/mirror/ \
  >> /var/log/rsync_push_$(date +%F).log 2>&1
  • 按日期自动分文件,历史清晰
  • 缺点:无时间戳,只有 rsync 原始输出

4. 记录同步账号(审计关键)

只有接收端(rsyncd 守护进程)能直接记账号,发起端记不了。

接收端 /etc/rsyncd.conf:

log file = /var/log/rsyncd.log
transfer logging = yes
log format = %t %a %u %o %n
  • %u = 认证用户名,%a = 对端 IP
  • 可按账号审计谁推了什么模块
  • 仅对走 rsyncd(rsync://host::module 认证方式)生效

发起端 --log-file 不记账号,需脚本手动补一行:

ACC="cnp"; DEST="/data/mirror/"
rsync -av --log-file=/var/log/rsync_push.log /data/mirror/ ${ACC}@host:${DEST}/
echo "$(date '+%F %T') account=${ACC} dest=${DEST}" >> /var/log/rsync_push.log

二、logrotate 日志轮转

1. 核心区别:两种日志场景

场景 配置要点
一次性进程日志(--log-file 推送端) 普通配置即可,无进程占用问题
常驻守护进程日志(rsyncd) 必须加 copytruncate(先复制再清空,进程不换句柄、不用重启)

2. 指令速查

指令 作用
daily / weekly / monthly / yearly 轮转频率(无半年/一年粒度)
rotate N 保留最近 N 份,超出删最旧
compress 旧日志压缩成 .gz
delaycompress 本轮刚切出的先不压,下次轮转再压(配合 copytruncate)
missingok 日志不存在不报错
notifempty 空日志不轮转
copytruncate 先复制再清空原文件,守护进程不用重启
dateext 轮转文件带日期后缀(如 rsyncd.log-20260904)

3. 重要:不写 rotate 会怎样?

不写 rotate 默认值为 0,轮转后旧日志直接删除,不会一直保存。

  • 想要保留 → 写 rotate N
  • 想长期保存 → rotate 9999(磁盘会涨,配合 compress)

4. 保留周期换算(无半年/一年粒度)

需求 配置
半年(按周切) weekly + rotate 26
半年(按月切) monthly + rotate 6
一年 weekly + rotate 52
两年 yearly + rotate 2(每年切一次)

5. 完整配置示例(rsyncd 守护进程日志,每周轮转保留半年)

/var/log/rsyncd.log {
    weekly
    rotate 26
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
    dateext
}

若推送端 /var/log/rsync_push.log 也要轮,写在一起:

/var/log/rsync_push.log /var/log/rsyncd.log {
    weekly
    rotate 26
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
    dateext
}

6. 部署流程

# 1. 创建配置
vim /etc/logrotate.d/rsync

# 2. 语法检查(不实际执行)
logrotate -d /etc/logrotate.d/rsync

# 3. 强制轮转验证
logrotate -f /etc/logrotate.d/rsync

# 4. 查看结果
ls -lh /var/log/rsync*log*
  • 系统 cron 每天自动跑(/etc/cron.daily/logrotate),无需自建 crontab
  • 验证时看到 rsyncd.log-20260904 之类的文件即成功

三、常见误区

  • ❌ 不写 rotate = 一直保存 → ✅ 默认 rotate 0,轮转即删
  • ❌ 守护进程日志用普通配置 → ✅ 必须 copytruncate,否则日志写入已改名的旧文件
  • ❌ logrotate 支持半年粒度 → 只有 daily/weekly/monthly/yearly
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。