写正则不再是噩梦:SLS数据加工GROK使用梳理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: GROK是一种采用组合多个预定义的正则表达式,用来匹配分割文本并映射到关键字的工具。可以将文本格式的字符串,转换成为具体的结构化的数据。

背景

由于正则表达式较为复杂,推荐您优先使用GROK函数。GROK是一种采用组合多个预定义的正则表达式,用来匹配分割文本并映射到关键字的工具。可以将文本格式的字符串,转换成为具体的结构化的数据。您可以在 GROK 里预定义好命名正则表达式,在稍后(grok参数或者其他正则表达式里)引用它。

GROK适用于syslog logs,apache和一些其他的webserver logs,以及mysql logs。grok有很多定义好pattern,当然也可以自己定义。

阿里云日志服务介绍

日志服务(Log Service,简称SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力。

数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。

SLS数据加工DSL是专门为日志实时行处理定制的一套语言(Python语法子集),本文档的目的也是让快速掌握该DSL,解决日志分析的问题。

数据加工中经常需要用到正则表达式从非结构化数据提取字段,所以可以在 GROK 里预定义好命名正则表达式,在GROK参数或者其他正则表达式里引用它。SLS数据加工提供了70+常用的GROK,例如身份证号、邮箱、MAC地址、IPV4、IPV6、时间解析、URL解析等,直接可以使用,具体可参见GROK模式参考。当然,GROK还可以进一步自定义扩展,这里主要介绍GROK函数。

GROK的使用

GROK语法

%{SYNTAX:SEMANTIC}

SYNTAX表示grok定义好的pattern,SEMANTIC表示自定义的字段。

例如192.168.0.100

用%{IP:client}可以将IP定义为client

假如现在某webserver log中的内容为以下格式:
55.3.244.1 GET /index.html 15824 0.043

我们完全可以利用grok将这些信息定义成以下字段

%{IP:client}%{WORD:method}%{URIPATHPARAM:request}%{NUMBER:bytes}%{NUMBER:duration}

grok过滤后得到的信息成了以下这样子:

client: 55.3.244.1

method: GET

request: /index.html

bytes: 15824

duration: 0.043

如何自定义Pattern

语法:(?the pattern here)

假如有以下内容“begin 123.456 end

我们希望将123.456定义成request_time字段,可以向下面这样写这个正则表达式

\s+(?\d+(?:\.\d+)?)\s+

解释:

\s:匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。+表示匹配次数为1次或者多次

(?  ):这个是grok语法,request_time表示要将捕获的字符定义成的字段名

\d+:匹配一个或者多个数字

(?:\.\d+):为正则表达式,

(?: pattern):非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

\.\d+:表示点后面跟一个或者多个 数字,(?:\.\d+)?表示点后面跟一个或多个数字这种情况出现0次或者多次,如果为0次,则request_time为一个整数。所以匹配到的结果可能为123.456或者123或者123.4.5.6,这些都满足条件

GROK函数格式

grok(pattern, escape=False, extend=None)

参数说明

参数名称

参数类型

是否必填

说明

pattern

String

以上所述GROK语法。也可以参见GROK模式参考

escape

Bool

是否将其他非GROK pattern中的正则相关特殊字符做转义,默认不转义。

extend

Dict

用户自定义的GROK表达式。

GROK有两种分组模式:

  • 捕获分组模式

GROK模式中部分是自带命名分组捕获的,所以针对这种模式只能使用%{SYNTAX}方式的语法。此类模式常见于语句解析。

"%{SYSLOGBASE}"        

"%{COMMONAPACHELOG}"

"%{COMBINEDAPACHELOG}"

"%{HTTPD20_ERRORLOG}"

"%{HTTPD24_ERRORLOG}"

"%{HTTPD_ERRORLOG}"

...

  • 非捕获分组模式

"%{INT}"    

"%{YEAR}"

"%{HOUR}"

...


您可以将GROK函数与正则表达式函数混合使用,如下所示:

e_match("content", grok(r"\w+: (%{IP})")) #匹配abc: 192.168.0.0或者xyz: 192.168.1.1等形式。

e_match("content", grok(r"\w+: (%{IP})", escape=True)) #不会匹配abc: 192.168.0.0,而是匹配\w+: 192.168.0.0。

数据加工中GROK使用举例

场景一 提取日期和引用内容

原始日志截取

content: 2019 June 24 "I am iron man"

加工规则

e_regex('content',grok('%{YEAR:year} %{MONTH:month} %{MONTHDAY:day} %{QUOTEDSTRING:motto}'))

加工结果


场景二 提取HTTP请求日志

原始日志截取

content: 10.0.0.0 GET /index.html 15824 0.043

加工规则

e_regex('content',grok('%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}'))

加工结果

场景三 提取Apache日志

原始日志截取

content: 127.0.0.1 - - [13/Apr/2015:17:22:03 +0800] "GET /router.php HTTP/1.1" 404 285 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

加工规则

e_regex('content',grok('%{COMBINEDAPACHELOG}'))

加工结果

场景四 Syslog默认格式日志。

原始日志截取

content: May 29 16:37:11 sadness logger: hello world

加工规则

e_regex('content',grok('%{SYSLOGBASE} %{DATA:message}'))

加工结果

场景五 转义特殊字符。

原始日志截取

content: Nov  1 21:14:23 scorn kernel: pid 84558 (expect), uid 30206: exited on signal 3

加工规则

e_regex('content',grok(r'%{SYSLOGBASE} pid %{NUMBER:pid} \(%{WORD:program}\), uid %{NUMBER:uid}: exited on signal %{NUMBER:signal}'))

因为加工规则中包含了正则特殊字符括号(),如果您不使用转义符,则添加escape=True参数即可,如下所示:

e_regex('content',grok('%{SYSLOGBASE} pid %{NUMBER:pid} (%{WORD:program}), uid %{NUMBER:uid}: exited on signal %{NUMBER:signal}', escape=True))

加工结果

场景六 用户自定义GROK表达式。

原始日志截取

content: Beijing-1104,gary 25 "never quit"

加工规则

e_regex('content',grok('%{ID:user_id},%{WORD:name} %{INT:age} %{QUOTEDSTRING:motto}',extend={'ID': '%{WORD}-%{INT}'}))

加工结果

场景七 匹配JSON数据。

原始日志截取

content: 2019-10-29 16:41:39,218 - INFO: owt.AudioFrameConstructor - McsStats: {"event":"mediaStats","connectionId":"331578616547393100","durationMs":"5000","rtpPackets":"250","rtpBytes":"36945","nackPackets":"0","nackBytes":"0","rtpIntervalAvg":"20","rtpIntervalMax":"104","rtpIntervalVar":"4","rtcpRecvPackets":"0","rtcpRecvBytes":"0","rtcpSendPackets":"1","rtcpSendBytes":"32","frame":"250","frameBytes":"36945","timeStampOutOfOrder":"0","frameIntervalAvg":"20","frameIntervalMax":"104","frameIntervalVar":"4","timeStampIntervalAvg":"960","timeStampIntervalMax":"960","timeStampIntervalVar":"0"}

加工规则

e_regex('content',grok('%{EXTRACTJSON}'))

加工结果

场景八 解析标准w3c格式日志。

原始日志截取

content: 2018-12-26 00:00:00 W3SVC2 application001 192.168.0.0 HEAD / - 8000 - 10.0.0.0 HTTP/1.0 - - - - 404 0 64 0 19 0

加工规则

w3c中没有的字段使用了短划线(-)替代,在GROK中也使用短划线(-)去匹配这些字段。

e_regex("content",grok('%{DATE:data} %{TIME:time} %{WORD:s_sitename} %{WORD:s_computername} %{IP:s_ip} %{WORD:cs_method} %{NOTSPACE:cs_uri_stem} - %{NUMBER:s_port} - %{IP:c_ip} %{NOTSPACE:cs_version} - - - - %{NUMBER:sc_status} %{NUMBER:sc_substatus} %{NUMBER:sc_win32_status} %{NUMBER:sc_bytes} %{NUMBER:cs_bytes} %{NUMBER:time_taken}'))

加工结果


其他参考




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
8天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
35 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
128 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
194 3
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
57 0
|
3月前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
65 0
|
3月前
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
78 0
|
3月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
145 0
|
3月前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
45 0