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

本文涉及的产品
日志服务 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]

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
自然语言处理 资源调度 前端开发
前端大模型入门(四):不同文本分割器对比和效果展示-教你如何根据场景选择合适的长文本分割方式
本文详细介绍了五种Langchain文本分割器:`CharacterTextSplitter`、`RecursiveCharacterTextSplitter`、`TokenTextSplitter`、`MarkdownTextSplitter` 和 `LatexTextSplitter`,从原理、优缺点及适用场景等方面进行了对比分析,旨在帮助开发者选择最适合当前需求的文本分割工具,提高大模型应用的处理效率和效果。
290 1
|
6月前
|
存储 前端开发 JavaScript
在视频点播系统工程中,我们关注的是构建一个能够处理视频内容、用户交互、数据存储和检索等功能的系统。
在视频点播系统工程中,我们关注的是构建一个能够处理视频内容、用户交互、数据存储和检索等功能的系统。
|
8月前
|
自然语言处理 中间件 测试技术
中间件数据格式结构化数据与非结构化数据之间的转换
中间件数据格式结构化数据与非结构化数据之间的转换
126 3
|
机器学习/深度学习 自然语言处理 算法
文本数据处理:基本技巧与实例分析
文本数据处理:基本技巧与实例分析
467 0
|
存储
<2>[QTCN]图片数据转换工具
说明:图片数据转换工具,可以批量将图片转换成数据,将数据转换为图片。 亮点:延时处理,图片数据解码,16进制格式和base64格式,进度条同步显示,文件保存等。 新增: 自动推算路径无需再选择(不存在则自动创建)
137 0
谈一谈|Word文档图片的提取
谈一谈|Word文档图片的提取
173 0
|
前端开发
前端工作总结116-动态渲染数据 数据在数字字典里面
前端工作总结116-动态渲染数据 数据在数字字典里面
107 0
|
数据可视化 数据挖掘
图表这么多,该用哪种展示我的数据呢?
上次赵小编给大家介绍了如何使用 Echarts 进行图形可视化,可见:如何快速画出美观的图形?。但是有些小伙伴问到:我应该怎么选择图表来展示我的数据呢?
145 0
图表这么多,该用哪种展示我的数据呢?
|
消息中间件 存储 算法
|
监控
日志服务数据加工最佳实践: 字符串动态键值对的提取
日志服务数据加工最佳实践: 字符串动态键值对的提取, 详细讲解e_kv, e_kv_delimit与e_regex在各种场景下的用法与推荐.
2607 0

热门文章

最新文章

下一篇
开通oss服务