商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > 如何在Linux中配置具体的日志文件自动切分

如何在Linux中配置具体的日志文件自动切分

  发布于2026-08-16 阅读(0)

扫一扫,手机访问

logrotate 的配置文件需要放到 /etc/logrotate.d/ 目录里,这一步不能放错。原因很直接:cron 实际上只会通过 /etc/cron.daily/logrotate 去调用 /etc/logrotate.conf,而后者又是靠 include /etc/logrotate.d 来加载具体配置的,换到其他路径,系统默认并不会识别。针对 Nginx 日志,通常要配上 daily、dateext、dateyesterday 和 dateformat -%Y-%m-%d,另外还得在 postrotate 里使用 kill -USR1 做安全重载,这样日志切分后服务本身也能平稳接管新文件。

如何在Linux中配置具体的日志文件自动切分

必须把配置文件放到 /etc/logrotate.d/ 目录下,否则 cron 永远不会执行它。

logrotate 配置文件该放哪儿、怎么加载

logrotate 并不会去“满系统乱找”配置,它实际上只看两个固定位置:/etc/logrotate.conf(主配置文件)和 /etc/logrotate.d/ 目录下的所有配置。系统每天会通过 /etc/cron.daily/logrotate 这个脚本执行 logrotate /etc/logrotate.conf,而主配置里默认又写着 include /etc/logrotate.d。说白了,Nginx、MySQL 这类服务的日志轮转配置之所以要放进这个目录,原因就在这里。

常见错误:

  • 把配置写在 /root/nginx.logrotate/usr/local/etc/logrotate.d/nginx,手动运行 logrotate -f 成功了,就以为部署好了——其实 cron 根本看不到
  • 给配置文件加 .conf 后缀(比如 nginx.conf),logrotate 会直接跳过它
  • 权限不是 644、属主不是 root:root,某些发行版会静默忽略

如何为 Nginx 日志配置按天切分并带日期后缀

关键不是只加 dateext,而是要配合 dailydateyesterday 才能生成形如 access.log-2026-07-08 的文件名(即“昨天”的日期,语义更准确)。

示例配置(写入 /etc/logrotate.d/nginx):

/var/log/nginx/*.log {
daily
dateext
dateyesterday
dateformat -%Y-%m-%d
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
pidfile=$(nginx -t 2>&1 | grep "pid" | awk '{print $NF}')
[ -f "$pidfile" ] && kill -USR1 $(cat "$pidfile")
endscript
}

注意点:

  • dateformat 必须紧接 dateext 使用,且格式字符串前要带短横线(-%Y-%m-%d),否则生成的文件名可能缺分隔符
  • postrotate 里别用 systemctl reload nginx:它会触发 worker 进程重启,有丢请求风险;kill -USR1 是原子重开日志句柄,零停机
  • pidfile 路径不能硬编码——nginx -t 输出里的 pid 行才是真实路径,兼容不同安装方式

按大小切分 vs 按时间切分,怎么选参数

如果日志增长不均匀(比如白天流量大、夜间几乎为零),单靠 daily 可能某天白切一次空文件;这时应优先用 size 触发,例如 size +50M(单位必须大写 M,小写 m 会报错)。

两者可以共存:

  • dailysize +50M 同时存在时,满足任一条件即触发轮转
  • rotate 7 控制的是保留份数,和 daily 无关——它不是“保留最近 7 天”,而是“最多留 7 个归档文件”
  • 高频小日志(如 debug 级)慎用 compress:压缩开销可能超过节省的空间
  • 如果服务不支持重载(比如某些 Ja va 应用),得用 copytruncate,但要注意:它靠复制+清空原文件实现,期间可能丢几行日志

调试和验证配置是否生效

别等第二天看效果,先本地验证:

  • 语法检查:logrotate -d /etc/logrotate.d/nginx —— 只打印动作,不真执行,重点看有没有 “error” 或 “skipping”
  • 强制立即执行:logrotate -f /etc/logrotate.d/nginx —— 生产环境慎用,避免和 cron 冲突导致重复切割
  • 查上次执行记录:cat /var/lib/logrotate.status,确认对应日志路径的最后轮转时间
  • 切完立刻检查:ls -l /var/log/nginx/,看新文件权限是否是 0640、旧文件名是否含日期、postrotate 是否成功发信号(ps aux | grep nginx 看 master 进程是否还在)

最容易被忽略的是 missingok:Nginx 刚装好还没产生日志时,没有它,整个 logrotate 任务会中断,后续所有配置都不执行。

本文转载于:https://www.php.cn/faq/2992550.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注