nginx日志分割
2012年7月10日
3 条评论
nginx日志本身不能通过配置来进行分割,如果要进行分割,需要通过写一个简单的脚本来实现这个功能。以前我一直都是用cp命令来做的,例如:
#/bin/bash nginxLog="/usr/local/nginx/logs/access.log" logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log" if [ ! -d ${logBakFile%/*} ] then mkdir -p ${logBakFile%/*} fi cp $nginxLog $logBakFile 2>&1 >/dev/null cat /dev/null > $nginxLog
原理很简单,就是通过cp命令拷贝一份当前的日志,拷贝完后清空当前日志。当然,如果nginx的并发量很大,可能会造成日志丢失情况。
今天无意中看到另外一种分割日志的方法,主要是通过mv命令来实现,我感觉可能比我以前的实现要好一些,特此记录一下。上述脚本可以修改为:
#/bin/bash nginxLog="/usr/local/nginx/logs/access.log" logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log" if [ ! -d ${logBakFile%/*} ] then mkdir -p ${logBakFile%/*} fi mv $nginxLog $logBakFile 2>&1 >/dev/null kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
先用mv命令把日志备份,然后使用kill -USR1 让nginx 重新打开日志文件。虽然这样也可能丢失日志,但mv命令执行肯定要cp快,所以相当来说要安全一些。
可以把上述脚本加入到crontab中,这样就可以实现按天、按小时等一些时间规则来进行日志分割