Linux日志管理工具logrotate
为dailyrotate 30compressmissingoknotifemptypostrotatesystemctl reload myapp # 假设需要重启服务endscript保存为即可生效。如果需要进一步分析某个具体场景或调试问题,请提供更多细节!
·
logrotate 是 Linux 系统中用于 自动轮转、压缩、删除和邮件日志文件 的实用工具,防止日志文件过大占满磁盘空间。它通过 /etc/logrotate.conf 和 /etc/logrotate.d/ 下的配置文件来管理日志轮转策略。
📌 基本工作原理
- 轮转(rotate):将当前日志文件重命名(如
access.log→access.log.1),并创建新的空日志文件。 - 压缩:轮转后的旧日志可压缩为
.gz节省空间。 - 删除:按策略保留指定数量的旧日志,超出的自动删除。
- 信号通知:轮转后向相关进程(如
nginx、rsyslog)发送信号(如USR1或HUP),使其重新打开日志文件。
🛠️ 配置文件结构
1. 主配置文件
/etc/logrotate.conf(全局配置):
weekly # 每周轮转一次
rotate 4 # 保留4个旧日志
create # 轮转后创建新日志文件
compress # 压缩旧日志
include /etc/logrotate.d # 加载子配置
2. 子配置文件
/etc/logrotate.d/ 目录下的文件(如 nginx, syslog):
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 日志不存在时不报错
rotate 14 # 保留14天
compress # 压缩旧日志
delaycompress # 延迟压缩(下次轮转时压缩)
notifempty # 空日志不轮转
create 0644 www-data adm # 新日志权限及属主
postrotate
# 通知nginx重新打开日志文件
nginx -s reopen
endscript
}
🔍 常用参数
| 参数 | 说明 |
|---|---|
daily/weekly/monthly/yearly |
轮转周期 |
rotate N |
保留N个旧日志后删除 |
compress |
用gzip压缩旧日志 |
delaycompress |
延迟到下次轮转时才压缩 |
missingok |
日志文件不存在时不报错 |
notifempty |
日志为空时不轮转 |
create mode owner group |
指定新日志文件的权限和属主 |
sharedscripts |
当配置了 sharedscripts 时,prerotate 和 postrotate 脚本在整个日志轮转过程中只执行一次,而不是为每个日志文件执行一次 |
prerotate/endscript |
轮转前执行的命令(如启动服务) |
postrotate/endscript |
轮转后执行的命令(如重启服务) |
🚀 手动触发轮转
测试配置是否正确:
sudo logrotate -d /etc/logrotate.conf # 调试模式(仅显示操作)
强制轮转某个日志:
sudo logrotate -f /etc/logrotate.d/nginx
🚨 常见问题
-
日志未轮转:
- 检查日志文件是否被进程锁定(如
lsof /var/log/nginx/access.log)。 - 确认
logrotate的 cron 任务存在(通常在/etc/cron.daily/logrotate)。
- 检查日志文件是否被进程锁定(如
-
权限错误:
- 确保
logrotate有权限读取日志目录(如/var/log/nginx/需允许logrotate用户访问)。
- 确保
-
轮转后日志未写入:
- 检查
postrotate脚本是否正确发送信号(如nginx -s reopen或kill -USR1 $(cat /var/run/nginx.pid))。
- 检查
📅 每日自动执行
logrotate 通过 cron 每日运行:
cat /etc/cron.daily/logrotate
# 内容通常是:/usr/sbin/logrotate /etc/logrotate.conf
📖 示例:自定义日志轮转
为 /var/log/myapp/*.log 设置轮转:
/var/log/cron
/var/log/myapp/*.log
{
daily
rotate 30
compress
missingok
notifempty
create 0644 root root
postrotate
systemctl reload myapp # 假设需要重启服务
endscript
}
保存为 /etc/logrotate.d/myapp 即可生效。
ubuntu ngin模版
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate;
fi
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
centos nginx模板
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
如果需要进一步分析某个具体场景或调试问题,请提供更多细节!
更多推荐



所有评论(0)