nginx 日志切割
Posted fanggege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 日志切割相关的知识,希望对你有一定的参考价值。
概述
nginx 日志一般都是两种access.log error.log ,可以每个location 区域配置一份,也就是每个请求服务一个日志。它的日志不会自动切割,需要人为根据时间或者日志量切割。
脚本完成nginx日志切割
vi /opt/nginx/cut_nginx_log.sh #!/bin/bash #此脚本用于自动分割Nginx的日志,包括access.log和error.log #每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
LOG_PATH=/opt/nginx/logs #Nginx日志文件所在目录 YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) #获取昨天的日期 PID=/var/run/nginx/nginx.pid #获取pid文件路径 mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log #分割日志 mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log kill -USR1 `cat ${PID}` #向Nginx主进程发送USR1信号,重新打开日志文件
制作计划任务
crontab -e # 输入以下内容并保存 00 00 * * * /bin/bash /opt/nginx/sbin/cut_nginx_log.sh
关于kill -USR1
nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项设置的值,如果文件不存在,会自动创建一个新的文件xx.log)。 然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)
nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成xxx.log-$date.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件xxx.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)
如果不运行此命令,即使access.log 已经改名为access-xxxxx.log 了但是nginx 还是会把日志写入access-xxxx.log 因为日志文件名字变了但是inode 等信息不变,所以不会自动把新日志写入access.log
拓展
日志切割有一个工具 logrotate,可以通过安装此工具来切割日志
以上是关于nginx 日志切割的主要内容,如果未能解决你的问题,请参考以下文章