背景
-
近期发现项目的访问量稳步上升
渐渐注意到一些接口响应时间过长,在此需设计读取接口耗时较长的日志(nginx 的 access.log日志)
在此将实现步骤记录如下,方便道友参考 . -
环境配置
宝塔面板 + Nginx 1.20.2 + PHP-7.2.33
实现步骤
记录操作步骤,方便日后查证
1. nginx 配置 http
- 首先,在 Nginx 的配置文件中,对如下位置进行修改 (可根据自己的需求进行配置)
- 配置信息如下:
log_format access_b1b_log
'[$remote_addr] $time_iso8601 [$request]'
'[$status] [$request_time]';
2. 网站配置
- 找到自己所有操作的网站,打开网站配置文件,注意对 access_log 的文件目录绑定操作
3. 统计请求时长 前100的请求
- 参考指令如下:
cat /www/wwwlogs/uat.b1b.com.log | awk '$2 >="[2024-09-20T15:01:20" && $2 <="[2024-09-20T16:48:17"' | awk '{print $NF " " $2" "$4}' | sort | uniq -c | sort -nr | head -n 100
根据个人需求,考虑设计一个脚本可以将需要的日志读取并存储到指定文件,方便后期的数据读取或直接查看
- 设计脚本实现步骤
1. 设定日志文件路径
2. 提取日志中,请求耗时排名靠前的地址 (匹配一个小时前的数据)
3. 进行结果打印
4. 将得到的结果,可以整理打印到指定 日志文件
- 设计脚本代码如下:
#!/bin/bash
# 设置日志文件路径
LOG_FILE="/www/wwwlogs/uat.b1b.com.log"
# 获取当前时间和一小时前的时间戳
HOUR_AGO=$(date '+%Y-%m-%dT%H' -d '1hour ago')
HOUR_AGO_SAVE=$(date '+%Y-%m-%d %H' -d '1hour ago')
# 提取日志中的 请求地址并统计出现次数
URL_TIME_LEN=$(cat $LOG_FILE |awk -v str_mz="$HOUR_AGO" '$2~ str_mz' |awk '!a[$4]++' | awk '{print $6 " "$2" "$4}' | sort | uniq | sort -nr)
# 提取前 100 个 请求地址
TOP_URL=$(echo "$URL_TIME_LEN" | head -n 100)
# 打印结果
echo ">>> Top 100 RequestUrl ($HOUR_AGO_SAVE时) :"
echo "$TOP_URL"
# 将结果整理打印到 日志文件
LOG_FILE_SUFFIX=$(date '+%Y-%m')
LOG_SAVE_FILE="/data/uat.b1b.com/storage/logs/access_analyze_$LOG_FILE_SUFFIX.log"
echo -e "\n>>> Top 100 RequestUrl ($HOUR_AGO_SAVE时)" >>$LOG_SAVE_FILE
TOP_URL2=$(echo "$URL_TIME_LEN" | head -n 100 >> $LOG_SAVE_FILE )
echo "$TOP_URL2"
- 配置计划任务,执行结果如下:
附录
- 如果想将收集到的日志数据,存储到数据库,方便直观的筛选排查
可考虑读取日志文件,进行存储分析