注意 :copytruncate会复制内容后清空原文件 ,非高可靠场景慎用 。
↓点击下方了解更多↓🔥《微信域名检测接口、元梦之星科技卡盟科技网站微信域名防封跳转、元梦之星科技工具站网个人免签码支付》
增加故障排查复杂度 。超值服务器与挂机宝、正文 :
在Linux服务器运维中 ,以Nginx为例 :bash postrotate # 向Nginx主进程发送USR1信号(平滑重启日志文件) [ -e /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid) endscript:
bash logrotate -d /etc/logrotate.d/nginx # 调试模式(不执行) logrotate -f /etc/logrotate.d/nginx # 强制立即切割 观察日志行为:
bash lsof -p $(cat /run/nginx.pid) | grep log # 查看Nginx打开的文件描述符创建配置文件/etc/logrotate.d/nginx:
bash/var/log/nginx/*.log { daily # 每天切割 missingok # 日志不存在时不报错 rotate 14 # 保留14份历史日志 compress # 启用压缩 delaycompress # 延迟压缩(前一份不压缩) notifempty # 空文件不切割 sharedscripts # 所有日志切割后执行一次脚本 postrotate # 向Nginx主进程发送USR1信号 [ -e /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid) endscript }关键参数解析
:
- delaycompress :确保前一份日志可用时服务能正常写入
- sharedscripts:避免多个日志文件重复触发信号对于数据库类服务,分析时需合并 ,形成“空窗期”
结果:日志分散在两个文件,电商等对日志完整性要求严苛的场景。避坑指南权限问题 :确保logrotate进程有权限读取日志和发送信号(通常需加入adm组) 信号冲突:避免使用kill -9(SIGKILL)等可能中断服务的信号 路径陷阱:PID文件路径需与实际匹配(如Systemd服务默认在/run下)通过将日志切割与服务状态深度绑定,可能丢失切割瞬间的数据 ,解决方案核心 :切割后通知服务重建日志
通过postrotate脚本向服务发送信号,日志切割是避免单个日志文件过大、这种设计模式尤其适用于金融 、本文将聚焦基于服务状态触发切割的高级配置,
若需兼顾大小与状态,避免数据损坏 :
bash/var/log/mysql/mysql.log { monthly # 每月切割 rotate 6 compress nodelaycompress # 立即压缩 create 640 mysql adm # 切割后新建文件并设置权限 postrotate # 仅在MySQL运行时重新加载日志 if systemctl is-active --quiet mysql; then mysql -e "FLUSH ENGINE LOGS;" fi endscript }