深色模式
日志轮转 logrotate
摘要:应用一天写几十 G 日志,磁盘迟早爆。本文为一个自定义应用配每日轮转、保留 7 天,并立即手动触发验证。前提:系统已装 logrotate(基本默认有)。
适用环境
bash
which logrotate
mkdir -p /var/log/myapp && echo "line" > /var/log/myapp/app.log
ls -l /etc/logrotate.d/ # 用户配置放这里1
2
3
2
3
一、写一份轮转配置
bash
cat > /etc/logrotate.d/myapp <<'EOF'
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root root
}
EOF1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
二、先检查配置语法
bash
logrotate -d /etc/logrotate.d/myapp # 干跑,只显示将要做什么
# 无报错(state 文件提示虚构)即配置 OK1
2
2
三、手动触发一次轮转
bash
logrotate -f /etc/logrotate.d/myapp # 强制执行
ls -l /var/log/myapp/
# 应出现 app.log.1(delaycompress 下首轮不压缩,下一轮变 .gz)1
2
3
2
3
验证
- [ ]
logrotate -d输出无错误 - [ ] 强制轮转后原
app.log被清空/重建,app.log.1生成 - [ ] 隔日 cron(通常
/etc/cron.daily/logrotate)自动轮转
常见坑
- 配置路径写错:
/var/log/myapp/*漏了.log可能不匹配,用*.log更明确。 - 权限不足:logrotate 以 root 跑,若日志属主非 root,注意
create的属主参数。 - copytruncate 场景:应用不重开文件句柄时用
copytruncate代替create,但会丢轮转瞬间数据。 - 忘记 reload 应用:
postrotate里要通知应用重新打开日志(如systemctl kill -s USR1 nginx)。