LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

Nginx日志别再一年一个文件了,按天切分原来这么简单

admin
2026年11月10日 15:10 本文热度 400

Nginx默认把一年的日志全写进同一个access.log,时间一长文件越滚越大,想查某天的问题得翻海量数据,磁盘也悄悄被撑满。把日志改成按天切分,一天一个文件,查起来清爽、删起来方便、还能自动压缩。这篇讲三种按天保存的实现方式,从最简单的定时任务到官方推荐的做法,你按自己的情况挑一个。

​

为什么默认日志会越滚越大

Nginx默认配置里就两行:access_log /var/log/nginx/access.log;和error_log。意思是所有访问日志都追加写进同一个文件,从你上线第一天写到今天,永远不切分。

带来的问题很直接:文件越来越大,几个G很常见;想查昨天下午的某个请求,得在几G文件里grep,慢还占内存;磁盘写满报No space left,网站直接挂。而且Nginx进程一直占着这个文件句柄,你直接rm删不掉空间,必须重启或清空。

按天切分就能解决这一切:每天零点,把当天日志写进一个带日期的文件,昨天的归档起来或压缩掉。下面三种方式,从简单到正式。

方式一:定时任务+重载,最简单

不用装任何工具,就用系统的cron配合Nginx自身的重载信号。思路是每天凌晨把当前日志改名成带日期的,然后让Nginx重新打开新日志文件。

先写一个小脚本,比如建一个/opt/rotate_nginx_log.sh:

YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)mv /var/log/nginx/access.log /var/log/nginx/access-$YESTERDAY.logkill -USR1 $(cat /var/run/nginx.pid)

解释一下:第一行算出昨天的日期,第二行把今天的日志改名成带昨天日期的归档文件,第三行kill -USR1让Nginx重新打开access.log——这是Nginx专门用来"重新打开日志"的信号,不会中断请求。

然后加到cron里,每天零点跑一次:

0 0 * * * /opt/rotate_nginx_log.sh

这样每天就会多一个access.log20261102的归档文件,当天的都写进新的access.log。配合上一篇讲的按天数清理,磁盘就不会爆。

方式二:logrotate,官方推荐的省心方案

如果你的系统里装了logrotate(绝大多数Linux发行版默认就有),用它更规范,能自动按天切分、自动压缩、自动清理,还不用自己写脚本。

在/etc/logrotate.d/下建一个文件,名字随意,比如nginx,写入:

/var/log/nginx/*.log {dailyrotate 30compressmissingoknotifemptysharedscriptspostrotatekill -USR1 $(cat /var/run/nginx.pid)endscript}

关键几行的意思:daily是按天切分,rotate 30是保留最近30个(也就是30天),compress是旧日志自动gzip压缩,postrotate里的kill -USR1和方式一的信号一样,切完后让Nginx重开日志。

配好后,logrotate会每天自动执行,什么都不用管。它还能顺手把超期的旧日志删掉,比方式一更省心,也适合日志量大的机器。

有可能出现报错:

nginx 没启动的时候,pid 文件不存在,后面 kill 命令执行失败,脚本返回非 0,logrotate 直接抛这个错误;

源码编译安装的 nginx,pid 文件不在 /run/nginx.pid,可能在 /usr/local/nginx/logs/nginx.pid;

还有一种:/home/wwwlogs/ 是自定义日志目录,SELinux 权限拦截。

解决方法如下:

原方法:

kill -USR1 $(cat /var/run/nginx.pid)

更新后:

kill -USR1 $(pgrep -f "nginx: master process") 2>/dev/null || :

方式三:直接把日期写进日志文件名

如果你想让Nginx自己就按天分文件,不用定时任务,可以在配置里用变量。Nginx支持$time_iso8601这类时间变量,配合字符串截取,可以拼出日期。

在nginx.conf的http块或server块里写:

if ($time_iso8601 ~ "^(\d{4}-\d{2}-\d{2})") {set $logdate $1;}access_log /var/log/nginx/access-$logdate.log;

这样每天零点后,第一个新请求来的时候,$logdate变成当天的日期,Nginx就自动写到access-2026-11-02.log这个文件,完全不用cron、不用脚本。

但这个方式有个小缺点:$logdate在if里用,性能上有一点点损耗,而且if在location上下文里有些坑。日志量特别大的生产环境,建议还是用方式二logrotate更稳妥。

配完记得验证,别看一眼就当好了

不管用哪种方式,配完都要验证:

手动跑一次切分(logrotate方式用logrotate -f /etc/logrotate.d/nginx强制跑一次),然后去/var/log/nginx/看看是不是生成了带日期的归档文件、当前access.log是不是新建的。

再用curl访问一下你的网站,确认访问能正常写入新的access.log,页面没报错。最后看下磁盘,用df -h确认空间确实被释放了。

如果切分后访问日志没写进去,八成是kill -USR1没生效或pid路径不对,用ps aux|grep nginx确认主进程号,cat一下nginx.pid对不对。

写在最后

Nginx按天存日志,本质就是一句话:让日志每天换个文件写。方式一适合想搞懂原理的人,方式二是生产环境的省心之选,方式三适合不想装东西的小规模场景。

配上日志按天切分,再搭配按天清理过期日志,你的磁盘使用率会稳定下来,查问题也能精准定位到某一天的文件。这一套配好,服务器运维里最磨人的"日志爆盘",就算彻底解决了。


阅读原文:点击这里​


该文章在 2026/11/10 15:17:52 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号