nginx日志过大问题解决

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/

1. 问题点

nginx默认的日志在logs/access.log,并且是一直累加写入,时间长了就会非常大,占用过多的硬盘,如果强行删除是很不友好的,需要重启服务;

2. 文件分割

nginx日志过大问题解决插图

上图文件已经达到了十个G左右

处理的思路肯定是生成带有日志的一系列的文件,然后保留一定的日志,这样才是一个正常的思路;log_format access-upstream $time_iso8601|$request|$remote_addr|$upstream_response_time|$http_user_agent|$http_x_forwarded_for; map $time_iso8601 $logdate { ~^(?<ymd>d{4}-d{2}-d{2}) $ymd; default date-not-found; } access_log logs/access-$logdate.log ; # access_log off; # 实在不需要的话,可以将其关闭(如心跳请求,会记录日志)

上面代码中主要使用到了map模块和对应的语法:

map指令使用ngx_http_map_module模块提供的。默认情况下,nginx有加载这个模块,除非人为的 –without-http_map_module。

ngx_http_map_module模块可以创建变量,这些变量的值与另外的变量值相关联。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。

加上之后重新加载配置文件:

# 检测配置是否正确 ./sbin/nginx -t #加载配置 ./sbin/nginx -s reload

nginx日志过大问题解决插图1

观察logs文件中已经生成了当日的日志,这是可以清理掉之前老文件了(如果确定没有用途的情况下),下一步就是做定时器,定时删除过期的文件

3. 定时器定时删除N天之前的日志

新建删除脚本,假如保留30天日志

#!/bin/bash # 指定日志文件夹路径 LOG_DIR=”/usr/local/nginx/logs” # 获取当前日期 CURRENT_DATE=$(date “+%Y-%m-%d”) # 计算 30 天前的日期 OLD_DATE=$(date -d “30 days ago” “+%Y-%m-%d”) # 遍历日志文件夹中的文件 for logfile in “$LOG_DIR”/*; do # 提取文件名中的日期部分 filename=$(basename “$logfile”) filedate=${filename#access-} filedate=${filedate%.log} # 如果文件的日期早于 OLD_DATE,则删除该文件 if [[ “$filedate” < “$OLD_DATE” ]]; then rm “$logfile” fi done

添加定时器

crontab -e

编辑并保存

0 0 * * * /usr/local/nginx/logs/cleanup_logs.sh

查看定时器

crontab -l

这样每天凌晨会清理掉30天之前的日志文件;


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容