切割日志文件
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/history
CUR_LOGS_PATH=/usr/local/openresty/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/taohui_access.log ${LOGS_PATH}/taohui_access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/maomaoxiong_access.log ${LOGS_PATH}/maomaoxiong_access_${YESTERDAY}.log
mv ${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]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@localhost nginx]# ll logs/
total 8
-rw-r--r--. 1 root root 0 Jan 2 07:19 access.log
-rw-r--r--. 1 root root 238 Jan 2 07:19 error.log
-rw-r--r--. 1 root root 6 Jan 2 07:19 nginx.pid.oldbin
[root@localhost nginx]# ps -ef|grep nginx
root 18245 1 0 06:10 ? 00:00:00 nginx: master process ./nginx
root 20877 18245 0 06:36 ? 00:00:00 nginx: master process ./nginx
nobody 20878 20877 0 06:36 ? 00:00:00 nginx: worker process
root 21394 21328 0 07:07 pts/5 00:00:00 grep --color=auto nginx
[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/logs
YESTERDAY=$(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}.log
mv ${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定时:
0 0 1 * * 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" -type f -mtime +$DAYS -exec rm {} \;
案例
切割日志的时候,先复制再停止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信号是重新打开所有日志文件。