Skip to content

切割日志文件

image-20250107074127730

nginx切割日志文件

切割日志文件

版权

本内容来自:《极客时间:Nginx 核心知识 150 讲》,版权归原作者所有,这里仅记录自己的学习笔记。

老师步骤

image-20250102074937373

备份原日志文件:

使用reopen命令重新打开:(系统新创建一个日志文件)

image-20250102075045287

将脚本写到bash里:

crontan -l 定时任务:

image-20250102075132866

image-20250102075152184

bash
#!/bin/bash#Rotate the Nginx logs to prevent a single logfile from consuming too much disk space.LOGS_PATH=/usr/local/openresty/nginx/logs/historyCUR_LOGS_PATH=/usr/local/openresty/nginx/logsYESTERDAY=$(date-d"yesterday"+%Y-%m-%d)mv${CUR_LOGS_PATH}/taohui_access.log${LOGS_PATH}/taohui_access_${YESTERDAY}.logmv${CUR_LOGS_PATH}/maomaoxiong_access.log${LOGS_PATH}/maomaoxiong_access_${YESTERDAY}.logmv${CUR_LOGS_PATH}/error.log${LOGS_PATH}/error_${YESTERDAY}.log#向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件kill-USR1$(cat/usr/local/openresty/nginx/logs/nginx.pid)

微信ocr:(垃圾)

bash
#!/bin/bash#Rotate the Nginx logs to prevent a single logfile from consuming too much disk space0GS PATH=/usr/local/openresty/nginx/logs/historyCUR LOGS PATH=/usr/local/openresty/nginx/logsYESTERDAY=$(date -d "yesterday"+%Y-%m-%d)my ${CUR LOGS PATH}/taohui access.log ${LOGS PATH}/taohui access ${YESTERDAY}.LOG${CUR LOGS PATH}/maomaoxiong access,log $fL0GS PATH}/maomaoxiong acceSS ${YESTERDAY}.LOgmymV $ICUR LOGS PATH}/error,log ${LOGS PATH}/error ${YESTERDAY}.LOg## 向 Nqinx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件kill -UsR1 $(cat /usr/local/openresty/nginx/logs/nsinx.pid)

1.自己当前环境

bash
[root@localhost nginx]# pwd/home/geek/nginx[root@localhost nginx]# lsclient_body_tempconffastcgi_temphtmllogsproxy_tempsbinscgi_tempuwsgi_temp[root@localhost nginx]# ll logs/total8-rw-r--r--.1rootroot0Jan207:19access.log-rw-r--r--.1rootroot238Jan207:19error.log-rw-r--r--.1rootroot6Jan207:19nginx.pid.oldbin[root@localhost nginx]# ps -ef|grepnginxroot182451006:10?00:00:00nginx:masterprocess./nginxroot2087718245006:36?00:00:00nginx:masterprocess./nginxnobody2087820877006:36?00:00:00nginx:workerprocessroot2139421328007:07pts/500:00:00grep--color=autonginx[root@localhost nginx]#

2.编写shell脚本

/usr/local/openresty/nginx/logs/rotate.sh

bash
#!/bin/bash#Rotate the Nginx logs to prevent a single logfile from consuming too much disk space.LOGS_PATH=/usr/local/openresty/nginx/logs/history#这个history需要我们自己提前创建CUR_LOGS_PATH=/usr/local/openresty/nginx/logsYESTERDAY=$(date-d"yesterday"+%Y-%m-%d)mv${CUR_LOGS_PATH}/taohui_access.log${LOGS_PATH}/taohui_access_${YESTERDAY}.log#作者的taohui_access.log和maomaoxiong_access.log都是原来自定义的名称的。那么问题来了,这个自定义日志文件如何配置呢?mv${CUR_LOGS_PATH}/maomaoxiong_access.log${LOGS_PATH}/maomaoxiong_access_${YESTERDAY}.logmv${CUR_LOGS_PATH}/error.log${LOGS_PATH}/error_${YESTERDAY}.log#向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件==reopen kill-USR1$(cat/usr/local/openresty/nginx/logs/nginx.pid)

crontab定时:

bash
001**root/usr/local/openresty/nginx/logs/rotate.sh

3.验证

本次先不测试,仅记录老师步骤。

FAQ

案例:其它demo

image-20250107074043226

bash
提供重新打开日志不会丢日志方式#!/bin/bash#设置日志文件存放目录logs_path="/alidata/log/nginx/access/"DAYS=30#设置pid文件pid_path="/alidata/server/nginx/logs/nginx.pid"#重命名日志文件mv${logs_path}default.log${logs_path}default-access_$(date-d"yesterday"+"%Y%m%d").log#向nginx主进程发信号重新打开日志kill-USR1`cat ${pid_path}`find${logs_path} -name"default-access_*.log"-typef-mtime+$DAYS -execrm{}\;

案例

切割日志的时候,先复制再停止ng,会漏掉从复制到停止中间这段时间的日志吧?

作者回复:是的,这个演示为了方便初学linux的同学理解,所以用了复制。 在生产环境中,应该把cp命令改为mv命令,因为linux文件系统中,改名并不会影响已经打开文件的写入操作,内核inode不变,这样就不会出现丢日志了。 谢谢你的提醒,视频最后应该提一下这个事的。

是的,如果用复制得话会丢掉从复制到reopen这段时间的日志,mv就不会因为文件虽然移动了,文件描述符并没有改变

案例:nginx官方没有提供logrotate

日志切割,为什么不用linux自带的logrotate,nginx也有提供logrotate配置文件。

作者回复:nginx官方没有提供logrotate,因为我们mv后直接reopen或者发送USR1信号就可以了。由nginx来做reopen更简单纯粹,因为nginx进程收到信号后,会把cycle里保存的所有打开的文件句柄,关闭掉再打开即可,就会生成新的日志文件。

案例:USR1信号是重新打开所有日志文件

请问一下,日志分割可以指定某个日志文件分割吗?比如说server里面有好多个不同的log,只想切割某一个日志文件,其他的log都不动.

作者回复:这种日志分割方法是不行的,因为USR1信号是重新打开所有日志文件。

最近更新