任务日志轮转是什么
定时任务把输出重定向到 /var/log 下的文件,脚本自己不会切分文件,长期追加必然吃满磁盘。logrotate 用一份声明式配置说明轮转节奏、保留份数与压缩策略,由系统自带调度每天调用一次,不必为每个任务单独写清理逻辑。
基本信息
| 适用平台 | Linux(logrotate 由 cron、anacron 或 systemd timer 驱动) |
|---|---|
| 配置目录 | /etc/logrotate.d/ 下每个服务一个文件 |
| 常用指令 | daily、rotate N、compress、copytruncate、create、notifempty、missingok |
| 验证方式 | logrotate -d 干跑查看计划,logrotate -vf 立即强制运行 |
典型使用场景
- 任务日志逐日归档:按天切割并压缩,保留 14 份覆盖两周排查窗口
- 日志被脚本长期持有:脚本不重开文件时用 copytruncate 原地截断,避免出现进程仍写已被切走的旧文件
- 多文件统一策略:一条通配路径覆盖 /var/log/app/*.log,不用逐文件维护
- 进程支持重开日志:用 postrotate 发信号让进程自己重开,比截断更无损
- 控制保留成本:压缩与保留份数直接决定磁盘占用,属于容量规划的一部分
轮转配置示例
轮转配置示例
# /etc/logrotate.d/app-jobs
/var/log/app/*.log {
daily # 按天切割
rotate 14 # 保留 14 份
compress # 归档即压缩
delaycompress # 最近一份不压缩,便于仍在写入的进程
missingok # 文件不存在不报错
notifempty # 空文件不轮转
copytruncate # 原地截断,进程无需重开日志
create 0640 root adm # 新文件的属主与权限
}验证与强制运行
验证与强制运行
sudo logrotate -d /etc/logrotate.d/app-jobs # 干跑:只打印计划动作
sudo logrotate -vf /etc/logrotate.d/app-jobs # 立即强制执行一次并输出详情
ls -lh /var/log/app/ # 确认新文件与压缩归档
logrotate -d /etc/logrotate.d/app-jobs 2>&1 | head -n 20常用指令对照
| 指令 | 作用 | 说明 |
|---|---|---|
| daily / weekly / monthly | 轮转周期 | 日志量大时可改用 size 触发 |
| rotate N | 保留份数 | 超出 N 份的最旧文件被删除 |
| compress / delaycompress | 归档压缩 | delaycompress 保留最近一份未压缩 |
| copytruncate | 截断而非改名 | 进程持有句柄时使用,可能丢一行 |
| create 0640 root adm | 新文件属性 | 不写时新文件可能属主不正确 |
| dateext | 归档名带日期 | 便于人工定位,可配合 dateformat |
持续持有日志句柄的脚本用 copytruncate,进程不必重开文件;但截断与下一次写入之间存在极小概率丢一行。
支持重开日志的进程优先用 postrotate 加信号(如 nginx 的 USR1),无损且不丢行。
copytruncate 对大文件会瞬时产生大量磁盘 IO,GB 级日志应选在低峰期执行或改用信号方案。