nginx 日志定时切割

2021年09月15日 阅读数:1
这篇文章主要向大家介绍nginx 日志定时切割,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

最近有个需求,须要查看咱们官网的日活,我是打算经过查看 nginx 日志,对每条日志进行切割,过滤出 ip,而后经过 set 集合去重,查看集合 set 的长度就是当天的日活了。个人 nginx 是经过 yum 安装的,默认会对 nginx 日志进行切割,可是天天切割的时间不是当天的 00 点,这样获得的日活数据可能不太准确。我就打算自定义 nginx 日志的切割。
css



所谓的"切割",并非真的把一个文件"切成两个",只是把原来的"access.log"文件重命名,好比重命名为今天的日期"2020-05-17.log",而后再建立一个名为"access.log"的新文件,以便新生成的日志仍然能够写入到名为"access.log"的新文件中,这样就能实现所谓的"日志滚动"或者"日志切割"的效果了。python


可是,这样作会遇到一些问题,咱们来手动操做一下,首先,重命名文件nginx

mv access.log 2020-05-17.log


咱们已经重命名了"access.log"文件,可是你会发现,重命名后,nginx日志仍然会写入到"2020-05-17.log"文件中,并不会自动建立一个新的"access.log"文件,即便你手动建立了一个新的"access.log"文件,nginx仍然会把日志写入到重命名后的"2020-05-17.log"文件中。shell


出现上述状况,是由于nginx进程读写日志文件时,是经过文件描述符去操做的,虽然咱们修改了原"access.log"文件的文件名,可是原文件描述符与文件自己的对应关系仍然存在,因此,单单对文件重命名是不够的,咱们须要让nginx从新打开一个新文件,以便将新的日志写入到新文件中。ruby


经过yum源安装nginx后,默认会安装一个日志滚动的配置文件,这个配置文件就是 "/etc/logrotate.d/nginx" ,须要把这个文件删除。默认的日志路径是在 "/var/log/nginx/" ,我是在这个文件夹下写了一个 shell 脚本, nginx_log_split.sh微信


D=$(date +%Y-%m-%d) # 获取当天的日期# 移动文件mv -f /var/log/nginx/access.log /var/log/nginx/${D}.logsleep 0.5s# 重启nginx/usr/sbin/nginx -s reload


使用 crontab 执行定时任务,crontab -e 后编辑一行
spa

00 00 * * * /var/log/nginx/nginx_log_split.sh

天天 0 点 0 分执行这个 /var/log/nginx/nginx_log_split.sh 脚本 .net

本文分享自微信公众号 - pythonista的平常(gh_fc70d5d98d3f)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。日志