晓夏

新手菜鸟Linux学习之路

不怕从零开始,只怕从未启程

关于nginx日志分割脚本的个人总结

浏览量:709

关于nginx的日志分割,简单的来说就是将nginx的日志文件mv(剪切)到备份目录中。

----------------------nginx_log_splite.sh-----------------------------------

#!/bin/bash

#进行nginx的日志分割,保存为前一天的日期

#nginx日志存放位置
LOG_PATH=/usr/local/nginx/logs
#获取昨天的日期,方便后面的日志重命名
YESTERDAY=$(date -d "yesterday" +%Y_%m_%d)
#存放日志目录
SAVE_DIR=/backup/nginx_log

#所谓的分割就是mv日志文件,然后重新打开一个新的日志文件

mv ${LOG_PATH}/access.log ${SAVE_DIR}/access_${YESTERDAY}.log        #access日志
mv ${LOG_PATH}/error.log ${SAVE_DIR}/err_${YESTERDAY}.log                #报错日志
mv ${LOG_PATH}/zblog_err.log ${SAVE_DIR}/zblog_err_${YESTERDAY}.log    #博客访问日志
mv ${LOG_PATH}/zblog_access.log ${SAVE_DIR}/zblog_access_${YESTERDAY}.log  #博客报错日志

#重新打开一个日志文件
kill -USR1 $(cat /usr/local/nginx/nginx.pid)

-------------------------------------------------------

#加入计划任务:
crontab -e
-------------------------------------------------------
#分割nginx日志(包括access以及博客日志)
01 00 * * * root /bin/sh ~/shell/nginx_log_splite.sh
-------------------------------------------------------

#重新加载计划任务
/etc/init.d/crond reload



虽然这个脚本网上一搜一大堆,但是始终有个疑问困扰着我,为什么最后要用kill -USR1 nginx的pid 这行命令中的USR1又是什么呢。

上面脚本的内容浅显易懂,就是将nginx的日志文件mv走,并且重命名为前一天的日志。这样我们的日志就算是备份完成了,但是这样的话有两个问题:
1、如果你细心的话会发现我们虽然将日志给mv走了,但是日志依然在往剪切走的文件中插入:如图↓

blob.png

blob.png

我们发现虽然我们mv走了日志,但是他依然在写入,而且写入到了我们mv的文件中,这就很奇怪了啊 。我们已经挪走了。为什么还在写入日志呢?

通过lsof + 文件名 我们可以发现文件虽然改名了,但是依旧还有nginx的进程占用着(我们只考虑在一块磁盘上)

blob.png

其实这是因为linux系统的inode信息的缘故。(详情请自行查询资料)




2、通过ls我们发现并没有zblog_access.log这个文件生成,那么我们的文件要写入到哪呢?难道要自己创建?如图:↓

blob.png

这时候USR1就有了作用了,首先我们先简单的说下USR1是干嘛的吧!
我从网上查了一些文档。里面的说法含糊不清,最后我的理解是USR1的作用是重新创建一个原有的日志文件,让新日志写入这个文件中,类似于nginx服务中的 nginx -s reopen(用来打开或者说是创建日志文件,让日志重新写入这个文件中)命令。
这样的话我们就解决了之前的问题,既新生成了被剪切走的日志文件,而且还让nginx将日志重新写入日志文件中。

所以脚本中才会在最后加入这么一行命令。
而关于USR1以及USR2 HUP的更多的介绍,我会在另一篇博客中浅显的介绍下,因为这跟linux的信号机制有关,而这块我并没有深入的了解过,如果以后有机会,会在博客中做详细介绍的。前提是我看懂了,如果想了解的话请kill -l 查看下所有的信号。


分享:

支付宝

微信