java 利用正则来分析日志(IT枫斗者)

news2024/11/8 17:08:16

利用正则来分析日志(IT枫斗者)

环境接口的历史并发数,然而运维并没有做相关的统计,没办法,只能拿到服务器近一个月的 Nginx access 日志,根据正则匹配所有我的接口服务的日志,然后统计每一秒内有多少个请求,最后做下排序即可

下载日志

  • 首先从服务器打包下载 Nginx 近一个月的 access log,运维配置了两个 Nginx,对应的日志也是两份,将两份日志下载到本地解压后如下图:

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cUEsblIS-1680827014866)(C:%5CUsers%5Cquyanliang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1680826888759.png)]

  • 首先为了方便编程,执行命令将所有日志合并为一个文件:

  • cd ~/Downloads/nginx-api1/
    cat access_api_2020-0* > test.log
    cat ../nginx-api2/access_api_2020-0* >> test.log
    

编写正则

  • 然后我们随意打开一份日志文件开始分析如何写正则:

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4q7K5TAW-1680827014867)(C:%5CUsers%5Cquyanliang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1680826923528.png)]

  • 从这份日志文件可以看出,红圈中的都是我们接口的 Url,我们要做的就是用正则匹配这些 Url,不难写出如下正则:

  • \[[0-3][0-9]\/(May|Apr)\/2020:[0-2][0-9](:[0-5][0-9]){2} \+0800\] "POST \/((register)|(v2\/register)|([a-f0-9]{32}(\/[a-z_]+)+)|(v2\/[a-f0-9]{32}(\/[a-z_]+)+))
    

编写代码

  • 但是我们可以发现这份日志中同一秒内同一辆车的同一请求被打印了多次,这是因为运维 Nginx 配置有误导致的,所以我们需要编写程序,剔除这种重复的日志打印 代码如下:

  • public static void main(String[] args) throws FileNotFoundException {
    
        Pattern pattern = Pattern.compile("\\[[0-3][0-9]/(May|Apr)/2020:[0-2][0-9](:[0-5][0-9]){2} \\+0800] \"POST /(" +
            "(register)|(v2/register)|([a-f0-9]{32}(/[a-z_]+)+)|(v2/[a-f0-9]{32}(/[a-z_]+)+))");
        Scanner scanner = new Scanner(new BufferedInputStream(new FileInputStream("/Users/jing/Downloads/nginx-api1" +
            "/test.log")));
    
        Map<String, Set<String>> map = new HashMap<>();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            Matcher matcher = pattern.matcher(line);
            if (matcher.find()) {
                String group = matcher.group();
                String key = group.substring(1, 21);
                String value = group.substring(35);
                if (map.containsKey(key)) {
                    Set<String> set = map.get(key);
                    set.add(value);
                } else {
                    Set<String> set = new HashSet<>();
                    set.add(value);
                    map.put(key, set);
                }
            }
        }
    
        ArrayList<Map.Entry<String, Set<String>>> list = new ArrayList<>(map.entrySet());
        list.sort(Comparator.comparingInt(o -> o.getValue().size()));
        
        for (int i = list.size() - 1; i > list.size() - 10; i--) {
            System.out.println(list.get(i).getKey() + " " + list.get(i).getValue().size());
        }
    }
    
  • 程序将每一秒的时间字符串作为 Map 的 Key,每一秒内的所有请求 Url 放入 Set 中,这样重复的 Url 会被自动去除,并将该 Set 作为 Map 的 value,所有数据都放入 Map 后,将 Map 转为 List,并对 List 按照 Set 的 size 从小到大排序,因为这里丁**想要知道每一秒的最大并发请求数,直接输出 list.get(list.size() - 1).getValue().size() 的值就可以了。

  • 程序运行输出如下:

  • 26/Apr/2020:17:18:22 10
    05/May/2020:17:10:32 9
    26/Apr/2020:18:27:46 9
    20/Apr/2020:07:48:15 9
    13/May/2020:18:33:20 9
    08/May/2020:07:41:20 9
    11/May/2020:08:12:20 8
    08/May/2020:17:34:17 8
    14/May/2020:17:19:23 8
    

验证

  • 可以看到这近一个月来,****环境每一秒内最多的并发数是 10,发生在 26/Apr/2020:17:18:22。接下来我们找到这个时间点的日志验证,是否真的是 10 个请求:

  • 请求 1 - 100.67.193.14 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "36.98.184.146" "0.014" "http" "80"
    请求 2 - 100.67.95.8 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/check HTTP/1.0" 200 2252 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "122.97.178.42" "0.095" "http" "80"
    请求 1 - 100.64.38.11 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "36.98.184.146" "0.063" "http" "80"
    请求 3 - 100.64.83.14 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/logFile/report HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "122.97.174.37" "0.091" "http" "80"
    请求 4 - 100.64.38.6 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "122.97.178.251" "0.219" "http" "80"
    请求 5 - 100.64.23.16 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "122.97.174.64" "0.008" "http" "80"
    请求 6 - 100.67.95.15 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/check HTTP/1.0" 200 39 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-/-" "122.97.179.60" "0.122" "http" "80"
    
    请求 7 - 100.64.35.7 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/check HTTP/1.0" 200 39 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.175.91" "0.104"80
    请求 8 - 100.64.23.4 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/check HTTP/1.0" 200 2252 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.174.64" "0.114"80
    请求 9 - 100.67.95.11 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.178.42" "0.008"80
    请求 9 - 100.67.93.17 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.178.42" "0.007"80
    请求 10 - 100.64.24.13 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/upgrade/report HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.178.128" "0.007"80
    请求 5 - 100.64.69.5 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.174.64" "0.103"80
    请求 5 - 100.64.32.17 - - [26/Apr/2020:17:18:22 +0800] "POST /************md5value************/report_sub_info HTTP/1.0" 200 30 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SABRESD-MX6DQ Build/F5.37)" "-//-" "122.97.174.64" "0.108"80
    
  • 去除重复请求后,果然是 10 个请求,证明计算结果无问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《低代码PaaS驱动集团企业数字化创新白皮书》-平台化加低代码提供破解之道(2)

平台化加低代码提供破解之道 低代码向业务的赋能&#xff1a;以效率和创新为核心&#xff0c;提升组织效率&#xff0c;促进创新&#xff0c;优化体验 通过IDC对大型企业的调研发现&#xff0c;当前拥有100个及以上应用数量的企业已经高达70%&#xff1b;IDC预测 ,2025年&…

〖Python网络爬虫实战⑮〗- pyquery的使用

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

数据结构——队列(C语言实现)

队列的概念与结构 队列是一种特殊的线性结构&#xff0c;数据只能在一端插入&#xff0c;数据也只能在另一端进行删除。插入数据的那一端称之为队尾&#xff0c;插入数据的动作称之为入队。删除数据的那一端称之为队头&#xff0c;删除数据的动作称之为出列。队列遵守的是FIFO…

LeetCode 189.轮转数组

文章目录&#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f6a9;思路1:暴力求解 --- 旋转k次&#x1f514;接口源码&#xff1a;&#x1f6a9;思路2:额外开数组&#x1f514;接口源码&#xff1a;&#x1f6a9;思路3:三段逆置&#x1f4cd;算法设计&#x1f514;接口源码&am…

JavaWeb开发 —— Web入门

目录 一、Spring 二、SpringBootWeb快速入门 三、HTTP协议 1. 概述 2. 请求协议 3. 响应协议 四、Web服务器 - Tomcat 1. 介绍 2. 基本使用 3. 入门程序解析 一、Spring ① 官网&#xff1a;http://spring.io ② Spring 发展到今天已经形成了一种开发生态圈&…

2022 idea 从原型创建maven项目框架--以创建niif-processors为列

目录一、idea配置二、下载archetype-catalog.xml文件三、创建设置四、创建成功截图一、idea配置 在如下两张图片花圈的位置添加如下参数 -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue 二、下载…

Qt Quick - 导航控件综述

Qt Quick - 导航控件综述一、概述二、StackView控件三、SwipeView控件四、TabBar控件五、TabButton控件一、概述 Qt Quick Controls提供了一系列导航模型。 控件功能Drawer可以用滑动手势打开和关闭的侧滑动面板StackView提供基于堆栈的导航模型SwipeView允许用户通过横向滑动…

面试官:谈谈你对TypeScript有什么了解

TypeScript 相关面试题1.说说你对 TypeScript 的理解&#xff1f;与 JavaScript 的区别是什么特性区别2.说说你对 TypeScript 中类的理解&#xff1f;应用场景&#xff1f;是什么使用方式继承修饰符私有修饰符受保护修饰符只读修饰符静态属性抽象类应用场景3.说说 typescript 的…

简单易用的公司网页模板,助您快速建站

在当今数字化时代&#xff0c;拥有一个高质量的公司网页是每个企业成功的关键。然而&#xff0c;对于那些没有技术专业知识的人来说&#xff0c;创建一个专业的网页可能是一项艰巨的任务。但是&#xff0c;现在有许多简单易用的公司网页模板可用于帮助您快速建站。 下面&#…

【CSS】文字溢出问题 ( 强制文本在一行中显示 | 隐藏文本的超出部分 | 使用省略号代替文本超出部分 )

文章目录一、文字溢出问题二、文字溢出处理方案三、代码示例一、文字溢出问题 在元素对象内部显示文字 , 如果文本过长 , 则会出现文本溢出的问题 ; 下面的示例中 , 在 150x25 像素的盒子中 , 显示 骐骥一跃&#xff0c;不能十步;驽马十驾&#xff0c;功在不舍; 一段话 , 明显…

【初识C++】(缺省参数和函数重载)

文章目录一、缺省参数1.缺省参数定义2.缺省参数分类2.1全缺省参数2.2半缺省参数二、函数重载1.函数重载概念2.构成重载的几种方式为什么会有函数重载及其原理一、缺省参数 1.缺省参数定义 缺省参数是在函数的声明中给定参数一个指定的值。 如果传参没有给定参数&#xff0c;那…

三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐

多数人消遣的方式一般是听听音乐玩玩游戏&#xff0c;想要更好的体验感最少不了的一定就是蓝牙耳机了&#xff0c;可对于大多数人来说&#xff0c;irpods之类的属实太贵了&#xff0c;所以更多人追求性价比&#xff0c;之前也买过不靠谱的耳机&#xff0c;用几天就坏了&#xf…

MySQL数据库:索引

一、索引简介 1.概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 相当于是给数据库中的数据建立了一个目录&#xff0c;通过目录可以知道…

QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。

QT多线程5种用法第一种 主线程(GUI)第二种 子线程1继承自QThread头文件 movetothread4.h源文件 movetothread4.cpp子线程1对象的创建第二种 子线程2继承自QThread头文件源文件对象创建位置&#xff08;销毁&#xff09;第三种 子线程3继承自QThread头文件源文件对象的创建第四种…

基于matlab仿真机械手

一、前言该示例显示了处于主动立体视觉模式的操纵器。它说明了立体渲染属性的效果以及如何使用立体视觉 VRFIGURE 属性。仅当图形卡支持四缓冲 OpenGL 渲染并由图形卡驱动程序启用时&#xff0c;操纵器才会以活动立体视觉模式显示。请注意&#xff0c;只有当您使用带有主动快门…

Android 布局 Fragment

Android 布局 FragmentFragment出现的初衷生命周期onCreate()onPause()onAttach()onCreateView()onActivityCreated()onDestroyView()onDetach()您可能还想扩展几个子类&#xff0c;而非 Fragment 基类&#xff1a;DialogFragmentListFragmentPreferenceFragmentCompat同系列文…

2.3.2单链表的插入删除

按位序插入&#xff08;带头结点&#xff09; 将第i-1个结点的指针指向第i个结点。 头节点看作是第0个结点。 s->datae //设定s指针的数据域为e s->nextp->next //将p指针指向的位置赋值给s指针指向的位置 p->nexts //再将s的数据域赋值给p指针指向的位置…

浅析分布式理论的CAP

大家好&#xff0c;我是易安&#xff01; 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中&#xff0c;可用性和数据一致性是两个至关重要的因素&#xff0c;而CAP理论就是在这两者之间提供了一种权衡的原则&#xff0c;帮助我们在设计分布式系统时进…

MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

光伏发电功率主要受太阳辐照度影响&#xff0c;所以准确预测太阳辐照度对光伏功率预测十分重要。程序采用小波分解先对辐照度数据进行分解&#xff0c;然后再用bp神经网络对分解的辐照度数据分别预测&#xff0c;再组合作为最后的预测结果。 人工神经网络(Artificial Neural …

研0进阶式学习---数据库1

目录Excel和数据库数据库的分类数据库的举例数据库基本结构数据库管理系统xampp、Navicat、MySQL基础知识与界面展示数据库基本连接步骤Excel和数据库 Excel和数据库都是用来存储数据的工具&#xff0c;但它们有以下区别和联系&#xff1a; 区别&#xff1a; 数据类型&#…