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,可以通过安装此工具来切割日志

相关推荐