Nginx日志切割

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

Nginx是我们生产环境的主要入口,所有的请求都会在这里留下痕迹,所以会导致一个问题,它的日志文件会一天比一天的大。直到有一天你无法接受这个庞大的文件的时候,就你就会想到了切割文件的这个办法。

能想到切割日志的童鞋那肯定是对Nginx用的熟悉的不能再熟悉的了,所以这里我就不过多的阐述Nginx的应用了,只说一个点  -USR1选项的用法


在没有执行kill -USR1 `cat ${pid_path}`之前,即便已经对文件执行了mv命令而改变了文件名称,

nginx还是会向新命名的文件” xxx.log_ 20130909”照常写入日志数据的。

原因在于:linux系统中,内核是根据文件描述符来找文件的


1、说说对linux文件描述符的理解

文件描述符是linux内核为每个打开的文件命名的一个整数标识。 

linux内核为每一个进程生成(或者说维护)一个”文件描述符表”,这个文件描述符表记录的是“此进程所打开的文件(进行标识)”。 

在这里的环境中,nginx就是一个运行中的进程,这个进程早就打开了一个日志文件,在文件描述符表是记录了文件的。 

即便日志文件的路径改变了,但是还是能够找到(根据文件描述符表可以定位)

2、说说脚本中kill -USR $(cat /var/run/nginx.pid)语法的理解

当执行命令“kill -USR1 `cat ${pid_path}`”的时候,nginx.pid文件中保存的其实就是一个数字(自己可以打开看一下,我这里是894),

nginx 将其主进程的 pid (进程号)写入到了nginx.pid 文件中,所以可以通过cat命令直接拿到其主进程号,直接操作指定的进程号。 

kill -USR $(cat /var/run/nginx.pid)就等同于 

kill –USR1 894  #指定发信号(USR1)信号给这个进程编号。 

3、说说脚本中kill -USR1 `cat ${pid_path}语法的理解

 在linux系统中,linux是通过信号与”正在运行的进程”进行通信的。linux系统中,也很多预定义好的信号,像SIGHUP。USR1是用户自定义信号。

 可以理解为:进程自己定义接到这个信号该干嘛(也就是进程编写者自己确定收到这个信号干嘛还是什么都不做都行,完全交给开发人员自己决定)。

 而在nginx中,它自己编写了代码处理当我接到USR1信号的时候,让nginx重新打开日志文件。

具体理解如下:

1、nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。 

2、然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)。 

3、nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成xxx.log_ 20130909.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件xxx.log)。

具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)

1
2
3
4
5
6
7
8
9
#!/bin/bash
#零点执行该脚本
#NGinx 日志文件所在目录
LOGS_PATH= /Disk/log/nginx
#获取昨天时间YYYY-MM-DD
YESTERDAY=$( date  -d  "yesterday"  +%Y-%m-%d)
#移动文件
mv  ${LOGS_PATH} /access .log ${LOGS_PATH} /access_ ${YESTERDAY}.log
kill  -USR1 $( cat  /var/run/nginx .pid)










本文转自 xinsir999 51CTO博客,原文链接:http://blog.51cto.com/xinsir/1915682,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
应用服务中间件 nginx
nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
【8月更文挑战第27天】nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
249 6
|
3月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
3月前
|
存储 监控 应用服务中间件
查看nginx日志文件
器性能和提高网站可用性。掌握日志文件的路径、查看方法和基本分析技能对于任何服务器管理员来说都是必备技能。
126 1
|
3月前
|
存储 Ubuntu 应用服务中间件
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
32 4
|
3月前
|
存储 应用服务中间件 nginx
部署ELK+filebeat收集nginx日志
部署ELK+filebeat收集nginx日志
123 0
部署ELK+filebeat收集nginx日志
|
3月前
|
应用服务中间件 Linux nginx
Nginx log 日志文件较大,按日期生成 实现日志的切割
Nginx log 日志文件较大,按日期生成 实现日志的切割
630 0
|
3月前
|
应用服务中间件 nginx
[nginx]日志中记录自定义请求头
[nginx]日志中记录自定义请求头
|
3月前
|
应用服务中间件 Shell nginx
shell分析nginx日志的一些指令
shell分析nginx日志的一些指令
|
3月前
|
应用服务中间件 Shell Linux
使用logrotate定期切割nginx日志
使用logrotate定期切割nginx日志
106 0
|
4月前
|
应用服务中间件 Linux 开发工具
Nginx14---目录结构分析,查看Ngnix访问日志命令的写法​
Nginx14---目录结构分析,查看Ngnix访问日志命令的写法​
下一篇
无影云桌面