一日一技:更友好的格式化数据提取方案

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一日一技:更友好的格式化数据提取方案

摄影:产品经理产品经理偷偷吃的好东西

在工作中,我们开发的系统会涉及到大量的日志。同时,我们还有另一套系统会对日志的内容进行监控,从而判断系统是否正常运作。

以 Nginx 的日志为例,这是一条访问日志:


162.158.167.131 - - [11/Aug/2020:06:47:30 +0800] "GET /tags/Tenacity HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://aspiegel.com/petalbot)"

这条日志包含了很多信息,包括:访问者的 IP 地址:162.158.167.131,访问发起的时间:11/Aug/2020:06:47:30 +0800,具体访问的路径:/tags/Tenacity,访问者的 User-Agent 等等。

一般情况下,我们可能需要编写正则表达式来提取这些信息,大家可以现在试一试,针对上面的日志,如果让你来写正则表达式,你会怎么写。

现在,我们有更好的选择,那就是parse这个第三方库。用它能够更加友好又方便地通过简单正则来提取复杂的内容。

我们可以使用pip安装它:


python3 -m pip install parse

安装完成以后,我们用一段简单的代码来进行测试:

>>> import parse>>> log = '162.158.167.131 - - [11/Aug/2020:06:47:30 +0800] "GET /tags/Tenacity HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://aspiegel.com/petalbot)"'>>> pattern = '{ip} - - [{dt:th}] "{method} {path} HTTP/1.1" {code:d} {length:d} "-" "{ua}"'>>> result = parse.search(pattern, log)>>> result['ip']'162.158.167.131'>>> result['ua']'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://aspiegel.com/petalbot)'>>> print(result.named){'ip': '162.158.167.131', 'dt': datetime.datetime(2020, 8, 11, 6, 47, 30, tzinfo=<FixedTzOffset +0800 8:00:00>), 'method': 'GET', 'path': '/tags/Tenacity', 'code': 301, 'length': 194, 'ua': 'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://aspiegel.com/petalbot)'}

运行效果如下图所示:

非常轻松地就把需要的字段全部以字典的形式提取了出来。并且日期、数字可以直接提取成对应的形式,免去了事后转换的麻烦。

只要我们自己系统的日志,按照统一的规范来写,那么也可以非常轻易地提取出来。例如我在爬虫多次爬取失败时,写出如下一条日志:


2020-08-11 13:21:41 [scrapy.extensions.logstats] INFO: [多次失败] https://xxx.com/aa/bb\n

那么我可以把提取的规则写为:


pattern = '[多次失败] {url}\n'

运行效果如下图所示:

关于 parse 的更多用法,请看它的 Readme[1]

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
JSON Go API
GO 权限管理之 Casbin
GO 权限管理之 Casbin
445 0
|
存储 芯片
SGM58031与单片机驱动实现
SGM58031与单片机驱动实现
752 0
|
5月前
|
人工智能 编解码 物联网
设计师集体破防!UNO:字节跳动创新AI图像生成框架,多个参考主体同框生成,位置/材质/光影完美对齐
UNO是字节跳动开发的AI图像生成框架,通过渐进式跨模态对齐和通用旋转位置嵌入技术,解决了多主体场景下的生成一致性问题。该框架支持单主体特征保持与多主体组合生成,在虚拟试穿、产品设计等领域展现强大泛化能力。
337 4
设计师集体破防!UNO:字节跳动创新AI图像生成框架,多个参考主体同框生成,位置/材质/光影完美对齐
|
8月前
|
存储 安全 Windows
电脑怎么格式化?格式化详细步骤
格式化是我们在日常使用电脑时可能会用到的一种操作,无论是清理磁盘空间、安装新系统,还是解决磁盘读写错误,都可能需要格式化。不过,对于一些不熟悉电脑操作的用户来说,格式化听起来可能有些复杂。其实,只要掌握正确的方法,格式化并没有那么困难。本文将带您了解什么是格式化,并一步步讲解如何格式化电脑。
|
编译器 Linux 开发者
.so文件如何反编译
【5月更文挑战第17天】.so文件如何反编译
621 2
|
缓存 网络协议 Linux
网络的救命稻草:重传机制如何确保数据顺利传输?
在网络传输中,数据的可靠性和稳定性一直是一个重要的挑战。幸运的是,重传机制应运而生,为我们解决了这个问题。本文将深入探讨重传机制在网络中的应用和工作原理。我们将介绍TCP中最常见的超时重传和快速重传,以及SACK和D-SACK这两种高级重传机制。了解这些机制如何工作可以帮助我们更好地理解数据传输的可靠性和稳定性的保障。
646 1
网络的救命稻草:重传机制如何确保数据顺利传输?
|
JavaScript Java Android开发
android studio中文乱码各种情况的解决办法
android studio中文乱码各种情况的解决办法
705 0
android studio中文乱码各种情况的解决办法
STM32F103驱动oled显示屏
STM32F103驱动oled显示屏
495 0
|
Web App开发 Linux Android开发
常见浏览器User-Agent大全
下面是工作中需要用到的常见浏览器User-Agent字符串的收集整理,不断更新中。 OperaMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.
12342 2
|
存储 数据采集 运维
带你读《基于数据资产全生命周期估值与实践报告》——2. 数据资产价值评估的核心因子说明(1)
带你读《基于数据资产全生命周期估值与实践报告》——2. 数据资产价值评估的核心因子说明
382 0