首页 > 系统相关 >分析nginx日志统计接口情况

分析nginx日志统计接口情况

时间:2024-03-26 21:35:08浏览次数:30  
标签:tmp 接口 nginx result action 日志

一、背景

近来打算对后端接口进行优化,所以要先对现有接口的情况进行统计。因为相关业务接口是index.php?action=XXX的形式,所以公司运维的管理平台并不能满足需求,所以要自行处理nginx日志获取接口的情况了。

二、处理思路

1.nginx日志中不止包含相关接口的日志,所以先要根据关键字段将需要的日志过滤出来。

2.分析nginx.conf中的日志格式,方便提取相关的字段

3.使用正则表达式将日志数据提取出来

4.处理数据,形成统计数据

(统计数据主要包括:接口action、调用总次数、2s以上的次数、慢数量占比、最大耗时、平均耗时)

三、脚本代码

因为这个脚本基本上算是一次性的,所以在细节地方可能考虑不全
  复制代码
<?php
//这里是对应的nginx.conf中的配置
$configData = '[$time_local] [$request] [$status] [$http_referer] [$request_time] [$upstream_response_time]';
$regex = '/\[([^\]]*)\]/ism';
preg_match_all($regex, $configData, $config);
$config = array_flip($config[1]);
//需要的字段
$keyList = array('$request_time', '$upstream_response_time');
$fp = fopen('nginx.log', 'r');
$result = array();
//逐行读取日志(一开始想用file_get_contents然后在explode生成数组,后因为文件比较大所以就弃用了)
while (!feof($fp)) {
    $logValue = fgets($fp);
    //处理日志数据
    preg_match_all($regex, trim($logValue), $log);
    $logList = $log[1];
    //提取需要的数据
    foreach ($keyList as $key) {
    $tmp[$key] = $logList[$config[$key]];
    }
    //从请求头中提取action
    $actionRegex = '/(?<=action=)[^&]*/';
    preg_match($actionRegex, $tmp['$request'], $action);
    $action = $action[0];
    //处理数据
if (isset($result[$action])) {
    $result[$action]['count']++;
    $result[$action]['allRequest'] += $tmp['$request_time'];
    if ($tmp['$request_time'] > $result[$action]['maxRequest']) {
    $result[$action]['maxRequest'] = $tmp['$request_time'];
    }
    if ($tmp['$request_time'] > 2) {
    $result[$action]['slowCount']++;
    }
    $result[$action]['averageRequest'] = $result[$action]['allRequest'] / $result[$action]['count'];
} else {
    $result[$action] = array(
    'count' => '1',
    'slowCount' => '0',
    'allRequest' => $tmp['$request_time'],
    'maxRequest' => $tmp['$request_time'],
    'averageRequest' => $tmp['$request_time'],
);
}
}
file_put_contents('result.log', json_encode($result));

四、正则表达式详解

  复制代码
$regex = '/\[([^\]]*)\]/ism';

\[  \] 是指以 "["开始及以"]"结束
() 是标记子表达式,并且可以提取出来使用
[^\]] 是中括号表达式,可以匹配任何字符除了"]"
* 是重复之前的中括号表达式零次或者多次

$actionRegex = '/(?<=action=)[^&]*/';
(?<=action=) 是反向肯定预查,从"action="处开始匹配查找字符串
[^&] 是中括号表达式,可以匹配任何字符除了"&"

五、统计结果

从nginx日志中获取了几天数据进行分析,截取了部分数据,之后就可以结合代码进行优化了!

 

六、心得

正则表达式每次用的时候还是不太稳,还是要多实践实践!


作者:caohaoyu
链接:https://juejin.cn/post/6844903655024361479
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:tmp,接口,nginx,result,action,日志
From: https://www.cnblogs.com/gaoyanbing/p/18097622

相关文章

  • FPGA接口系列——UART
    FPGA接口系列——UART一、UART简介UART是一种采用异步串行通信方式的通用异步收发传输器。这里我们主要弄明白两个问题:①什么是串行通信,与并行通信有什么区别②同步串行通信和异步串行通信有什么区别③我们常说的UART和RS232以及RS485又有什么区别?串行通信和并行通信......
  • 规范 - 接口文档
    作者:Zonezzc最后更新时间:2024-03-2619:13:06​​原则接口的命名最终一定是便于理解的中文。接口的说明中一定包含接口原名如getSellerStandardsProfile,若存在第三方在线接口文档,该原名设置为引向原文的超链接。所有的参数都要有中文注释。命名规范对接口理解不透彻......
  • Temu api接口 获取商品详情 数据采集
    iDataRiver平台https://www.idatariver.com/zh-cn/提供开箱即用的Temu电商数据采集API,供用户按需调用。接口使用详情请参考Temu接口文档接口列表1.获取商品详情参数类型是否必填默认值示例值描述apikeystring是idr_***从控制台里复制apikeycountryst......
  • 规范 - 接口文档
    规范-接口文档作者:Zonezzc最后更新时间:2024-03-2619:13:06​​原则接口的命名最终一定是便于理解的中文。接口的说明中一定包含接口原名如getSellerStandardsProfile,若存在第三方在线接口文档,该原名设置为引向原文的超链接。所有的参数都要有中文注释。命名规范......
  • 使用 GoAccess 分析 Nginx 日志
    来源:https://cloud.tencent.com/developer/article/1449085 GoAccess是一款开源的且具有交互视图界面的实时Web日志分析工具,通过你的Web浏览器或者*nix系统下的终端程序(Terminal)即可访问。GoAccess能为系统管理员提供快速且有价值的HTTP访问统计,并以在线可视化......
  • springboot整合knife4j接口文档
    1、添加knife4j依赖这里是最新版本的依赖,我也会使用这个最新版本的依赖来进行举例。knife4j官网<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifactId><version>4.4.0</version></d......
  • 【SpringBoot3+Mybatis】小程序和后台管理系统 员工/分类/菜品/套餐管理 上传文件 CRU
    文章目录一、项目介绍&Github二、技术选型三、开发环境搭建四、员工管理4.1新增员工①sql②对象拷贝DTO与Entity③异常捕获与处理④动态获取当前登录者Id⑤ThreadLocal4.2员工分页查询①请求参数实体与响应数据实体②controller层③service层使用pageHelper......
  • [QLIE] 封包接口Hook
    [QLIE]封包接口Hook这个主题快拖了半个月,中间一直没空写,今天看着实在有点久了,必须写一写了,不然就快忘记了。起因前不久HappyLiveShowUp发了官中,但是又搞的奇奇怪怪的加密,很是无聊,稍微调了下和之前ハミダシクリエイティブ官中是挺像的。steam的dll是用Themida保护的,其......
  • Mybatis的接口映射原理
    1、问题引入在使用Mybaits时,只需要写一个Mapper接口(不用写实现类),并在对应的xml文件中写好sql。然后,Mybatis就自动实现了具体的CRUD方法调用。通常我们使用Mybatis的主要步骤是:构建SqlSessionFactory(通过xml配置文件,或者直接编写Java代码)从SqlSessionFactor......
  • SpringBoot手动取消接口执行方案
    实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案自定义注解用于标记耗时接口@Retention(RetentionPolicy.RUNTIME)@Target({El......