使用 Logrotate 管理 Nginx 日志的完整指南
Logrotate 是 Linux 系统标准的日志管理工具,特别适合处理 Nginx 日志。
#Logrotate
#日志
#服务器
使用 Logrotate 管理 Nginx 日志的完整指南
Logrotate 是 Linux 系统标准的日志管理工具,特别适合处理 Nginx 日志。以下是详细配置步骤:
1. 创建 Logrotate 配置文件
sudo nano /etc/logrotate.d/nginx
输入以下内容(根据你的系统调整用户/组):
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 如果日志不存在,不报错
rotate 14 # 保留14天的日志(压缩后)
compress # 压缩旧日志
delaycompress # 延迟一天压缩(保留未压缩的最近日志)
notifempty # 空日志不轮转
create 0640 www-data adm # 创建新日志文件的权限(Ubuntu)
# create 0640 nginx nginx # CentOS/RHEL
sharedscripts # 所有日志处理完后执行一次脚本
postrotate # 轮转后执行的命令
# 向 Nginx 主进程发送 USR1 信号,通知重新打开日志
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
2. 配置详解
选项 | 说明 |
---|---|
daily | 每天轮转日志 |
rotate 14 | 保留14份旧日志(14天) |
compress | 使用 gzip 压缩旧日志 |
delaycompress | 延迟一天压缩(保留最新日志未压缩) |
create 0640 www-data adm | 创建新日志文件,设置权限和所有者 |
sharedscripts | 所有日志处理完后执行一次脚本 |
postrotate | 轮转后执行的命令 |
missingok | 日志文件不存在时不报错 |
notifempty | 空日志文件不轮转 |
3. 测试 Logrotate 配置
手动测试
# 测试配置文件语法
sudo logrotate -d /etc/logrotate.d/nginx
# 强制立即执行轮转(-v 详细输出,-f 强制)
sudo logrotate -vf /etc/logrotate.d/nginx
验证效果
# 查看日志文件
ls -lh /var/log/nginx/
应该看到类似:
access.log # 新的当前日志
access.log.1 # 昨天的日志(未压缩)
access.log.2.gz # 前天的日志(已压缩)
...
4. 自定义配置示例
保留90天日志(适用于高流量站点)
/var/log/nginx/*.log {
daily
rotate 90
...
}
按小时轮转(超高频访问)
/var/log/nginx/*.log {
hourly
rotate 168 # 保留7天(24小时×7)
...
}
处理特定日志文件
/var/log/nginx/access.log
/var/log/nginx/error.log {
daily
rotate 30
...
}
最大日志大小限制
/var/log/nginx/*.log {
size 100M # 当日志达到100MB时轮转
rotate 5 # 保留5份旧日志
...
}
5. 解决常见问题
权限问题修复
# Ubuntu/Debian
sudo chown -R www-data:adm /var/log/nginx/
sudo chmod 755 /var/log/nginx/
# CentOS/RHEL
sudo chown -R nginx:nginx /var/log/nginx/
手动创建日志文件
sudo touch /var/log/nginx/access.log
sudo chown www-data:adm /var/log/nginx/access.log # Ubuntu
sudo chown nginx:nginx /var/log/nginx/access.log # CentOS
检查 Logrotate 状态
# 查看 Logrotate 最后执行时间
grep logrotate /var/log/syslog | tail
# 检查 cron 是否配置
ls /etc/cron.daily/logrotate
6. Logrotate 工作原理
1. 定时执行:通过 /etc/cron.daily/logrotate 每天自动运行
2. 配置文件:读取 /etc/logrotate.conf 和 /etc/logrotate.d/*
3. 执行流程:
- 重命名当前日志文件(如 access.log → access.log.1)
- 创建新的空日志文件
- 发送信号通知 Nginx 重新打开日志文件
- 压缩旧日志(根据 delaycompress 设置)
- 删除超期的旧日志
7. 进阶技巧
自定义压缩程序
compresscmd /usr/bin/xz
compressoptions -9
compressext .xz
邮件通知
mail admin@example.com
按日期命名旧日志
dateext # 使用日期作为后缀
dateformat -%Y%m%d # 日期格式:-20231015
处理完成后执行脚本
lastaction
# 例如:将日志上传到云存储
/usr/local/bin/upload-logs.sh
endscript
8. 验证 Nginx 日志重开
检查 Nginx 进程是否接收到 USR1 信号:
sudo journalctl -u nginx | grep 'USR1'
应该看到类似:
nginx: signal process started
9. 恢复误删日志文件
如果日志文件意外丢失:
# 重新创建日志文件
sudo touch /var/log/nginx/access.log
sudo chown www-data:adm /var/log/nginx/access.log # Ubuntu
# 通知 Nginx 重新打开日志
sudo kill -USR1 $(cat /var/run/nginx.pid)
通过以上配置,Logrotate 会自动管理你的 Nginx 日志,实现每日分割、压缩和清理旧日志,保持服务器存储空间高效利用。
/www/wwwlogs/www.liandian.com.log
/www/wwwlogs/www.liandian.com.error.log {
daily
missingok
rotate 180
compress
delaycompress
notifempty
create 0640 www www
sharedscripts
dateext
dateformat -%Y%m%d
postrotate
# 使用更精确的文件检查和现代语法
if [ -f /www/server/nginx/logs/nginx.pid ]; then
kill -USR1 $(cat /www/server/nginx/logs/nginx.pid)
else
echo "Nginx PID file not found at /www/server/nginx/logs/nginx.pid" >&2
fi
endscript
}