切割日志文件
nginx切割日志文件
切割日志文件
版权
本内容来自:《极客时间:Nginx 核心知识 150 讲》,版权归原作者所有,这里仅记录自己的学习笔记。
老师步骤
备份原日志文件:
使用reopen命令重新打开:(系统新创建一个日志文件)
将脚本写到bash里:
crontan -l 定时任务:
#!/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:(垃圾)
#!/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.自己当前环境
[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
#!/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定时:
001**root/usr/local/openresty/nginx/logs/rotate.sh
3.验证
本次先不测试,仅记录老师步骤。
FAQ
案例:其它demo
提供重新打开日志不会丢日志方式#!/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信号是重新打开所有日志文件。