logrotate轮转后应使用postrotate执行安全重载而非重启,优先调用nginx -s reload等平滑重载命令;需验证配置有效性、服务信号支持及日志路径,并通过sharedscripts避免重复触发。

Logrotate 轮转后重启服务,核心是用 postrotate 段执行安全重载命令,而不是简单“重启”。对 Nginx、rsyslog 等支持平滑重载的服务,应优先用 nginx -s reload 或 systemctl reload xxx,避免中断连接或丢失日志。
确保服务支持信号重载
不是所有服务都响应 HUP 或 USR1 信号。Nginx、Apache、rsyslog、syslog-ng 默认支持 reload;而部分 Java 应用或自研服务需自行实现日志 reopen 逻辑。可先验证:
- 检查进程是否监听 HUP:
kill -0 $(cat /run/nginx.pid) 2>/dev/null && echo "OK" - 测试配置有效性(Nginx):
nginx -t - 确认当前打开的日志路径:
ls -l /proc/$(cat /run/nginx.pid)/fd/ | grep log
在 postrotate 中写安全重载逻辑
直接写 systemctl reload nginx 可能因 unit 状态异常失败;更可靠的方式是先校验再发信号:
- 用
nginx -t &>/dev/null判断配置是否合法 - 仅当校验通过时执行
nginx -s reload - 添加简单日志便于排错:
echo "$(date): nginx reloaded" >> /var/log/logrotate.nginx.log - 整个块必须包裹在
postrotate和endscript之间
完整 Nginx 配置示例
编辑 /etc/logrotate.d/nginx,内容如下:
/var/log/nginx/*.log {<br> daily<br> missingok<br> rotate 14<br> compress<br> delaycompress<br> notifempty<br> create 0640 www-data adm<br> sharedscripts<br> postrotate<br> if nginx -t >/dev/null 2>&1; then<br> nginx -s reload >/dev/null 2>&1<br> echo "$(date): nginx reloaded" >> /var/log/logrotate.nginx.log<br> fi<br> endscript<br>}
注意:sharedscripts 表示整个日志组只运行一次 postrotate(避免每个 .log 文件都触发一次 reload)。
验证与调试方法
配置完别急着等 cron,立刻验证是否生效:
- 语法检查:
sudo logrotate -d /etc/logrotate.d/nginx(只模拟,不执行) - 强制运行一次:
sudo logrotate -vf /etc/logrotate.d/nginx - 检查新日志是否生成:
ls -lh /var/log/nginx/access.log* - 确认 Nginx worker 进程已更新打开的文件:
sudo lsof -p $(cat /run/nginx.pid) | grep log











