前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx 日志定时切割

nginx 日志定时切割

作者头像
用户4945346
发布2020-06-16 10:46:13
6880
发布2020-06-16 10:46:13
举报
文章被收录于专栏:pythonista的日常pythonista的日常

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

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

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

代码语言:javascript
复制
mv access.log 2020-05-17.log

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

出现上述情况,是因为nginx进程读写日志文件时,是通过文件描述符去操作的,虽然我们修改了原"access.log"文件的文件名,但是原文件描述符与文件本身的对应关系仍然存在,所以,单单对文件重命名是不够的,我们需要让nginx重新打开一个新文件,以便将新的日志写入到新文件中。

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

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

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

代码语言:javascript
复制
00 00 * * * /var/log/nginx/nginx_log_split.sh

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档