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/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:(垃圾)

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]# 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

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/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定时:

bash
0 0 1 * * 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" -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信号是重新打开所有日志文件。

最近更新