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 日志切割的主要内容,如果未能解决你的问题,请参考以下文章

nginx 日志切割

Nginx日志切割

切割nginx日志

Nginx 日志切割

Nginx-日志切割

nginx日志切割