SLS数据加工“事件搜索”实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SLS数据加工函数-e_search用法以及实践


背景介绍

什么是日志服务?

日志服务是针对日志类数据的一站式服,像Log、Metric这类数据我们可以提供大规模、低成本、实时的平台化服务。它的应用场景非常多,像一些监控、分析、诊断都可以通过日志服务去实现,无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力

什么是数据加工?

数据加工是日志服务推出的一项功能,是面向日志进行实时的处理,实时性高且功能丰富。数据加工目前提供了两百多种DSL算子用作数据处理,我们可以在数据加工中根据需求做数据过滤、转换、复制、富化、分裂等操作。

函数简介:

在数据加工中,使用e_search可以进行事件搜索

语法:e_search("查询字符串")

参数名称

参数类型

是否必填

说明

查询字符串

String

用于快速过滤的语法。

  • 返回结果满足条件返回True,否则返回False。

功能概览

e_search使用了查询字符串语法,查询字符串语法是SLS DSL中用于快速过滤数据的语法,可以简化条件判断。

不同搜索功能对字段搜索和全文搜索的支持情况如下表所示。

功能

字段搜索

全文搜索

子串搜索

支持

支持

通配符*?搜索

支持

支持

完全匹配搜索

支持

不支持

正则表达式搜索

支持

不支持

数值范围搜索

支持

不支持

数值比较

支持

不支持

关系and、or、not及组合

支持

支持


字符转义

在字符串查询语法中,需要对一些特殊字符,例如星号(*)、反斜线(\)等进行转义操作。

  • 字段名转义字段名不能使用双引号("")包裹,包含特殊字符时使用反斜线(\)转义。例如:

 \*\(1+1\)\?: abc:使用反斜线(\)转义。

  __tag__\:__container_name__: abc:使用反斜线(\)转义。

 中文字段: abc:中文不需要转义。

 "content": abc:非法定义,字段名不能用双引号("")包裹。

  • 搜索值转义
  • 包含引号(")或反斜线(\)时需用反斜线(\)转义,例如:

content: "abc\"xy\\z"

需要包裹字段值时,只能使用双引号("")包裹。您可以使用单引号('')包裹外层字符串,使用双引号("")包裹里层字符串,例如:e_search('field1:"字符串" ')。

  • 搜索星号(*)或问号(?)时需要使用反斜线(\)转义,否则会被视为通配符匹配。
  • 只包含中文、字母、数字、下划线(_)、短划线(-)、星号(*)或问号(?)这些特殊字符时,不需要用双引号("")包裹,其他情况需要使用双引号("")包裹。例如:

status: "\*\?()[]:=":使用双引号("")包裹,并使用反斜线(\)对星号(*)、问号(?)进行转义,其他字符不用转义。

content: ()[]:=:非法定义,需要使用双引号("")包裹。

status: active\*test、status: active\?test:字段值仅包含星号(*)、问号(?)及字母,只需要对星号(*)或问号(?)进行转义,不需要使用双引号("")包裹。


子串搜索

  • 全文搜索在所有字段中搜索子串。
  • 语法格式e_search('子串')
  • 示例

e_search('"错误"'):搜索中文子串。

e_search('"active error"'):搜索完整带空格的子串。

e_search('active error'):多个子串搜索,多个子串之间默认为OR关系。

  • 字段搜索在特定字段中搜索子串。
  • 语法格式e_search('...')
  • 示例

e_search('status: active'):子串搜索。

e_search('author: "john smith"'):带空格子串搜索。

e_search('fileld: active error')相当于field:active OR "error",表示在field字段中搜索active或者全文搜索error。

通配符搜索

星号(*)表示零个或多个字符串,问号(?)表示一个字符,也可以表示一个宽字符(例如中文字符)。

  • 全文搜索在所有字段中搜索子串。
  • 语法格式e_search('子串')
  • 示例

e_search('active*test'):匹配零到多个字符,因为字符串中有星号(*),所以该字符串不需要使用双引号("")包裹。

e_search('发生*错误'):匹配零到多个字符,可以匹配发生错误,发生严重错误等。

e_search('active?good'):匹配一个字符,因为字符串中有问号(?),所以该字符串不需要使用双引号("")包裹。

e_search('ac*tive?good'):完全匹配。

e_search('ac*tive??go*od'):支持多个混合使用。

  • 字段搜索在特定字段中搜索子串。
  • 语法格式e_search('字段名:子串')
  • 示例

e_search('status: active*test'):匹配零到多个字符。

e_search('status: active?good'):匹配一个字符。

完全匹配

  • 完全匹配要求对字段值从开始到结尾完全匹配。
  • 语法格式e_search('字段名==完全匹配字符串')
  • 示例

e_search('author== "john smith"'):author字段完全等于john smith。

e_search('status== ac*tive?good'):与通配符结合使用。

正则表达式匹配

  • 正则表达式匹配是比通配符匹配更强大的匹配方式。
  • 语法格式e_search('字段名~=正则表达式字符串')说明
  • 示例

e_search('status~= "\d+"'):status字段包含数字。

e_search('status~= "^\d+$"'):status字段等于数字。

由于正则表达式中可能包含反斜线(\),推荐使用r进行不转义。

默认为部分匹配,如果需要完全匹配,需要在开头和结尾加上^和$。

数值比较

  • 数值直接比较使用>>==<<=进行比较。
  • 示例

e_search('age >= 18')  #  >=18

e_search('age > 18')   #  > 18

e_search('age = 18')   #  = 18

e_search('age <= 18')  #  <=18

e_search('age < 18')   #  < 18

  • 数值范围比较:使用闭区间,支持使用星号(*)表示无边界。
  • 示例

e_search('count: [100, 200]') # >=100 and  <=200

e_search('count: [*, 200]')   # <=200

e_search('count: [200, *]')   # >=200

逻辑关系

支持任意搜索之间的逻辑关系,也支持用圆括号()进行嵌套。

逻辑关系

关键字

andAND&&等,不区分大小写。

orOR等,不区分大小写。

notNOT!等,不区分大小写。


示例:


e_search('abc OR xyz')    # 关系运算符不区分大小写

e_search('abc and (xyz or zzz)')

e_search('abc and not (xyz and not zzz)')

e_search('abc && xyz')    # and

e_search('abc || xyz')    # or

e_search('abc || !xyz')   # or not

子串匹配也支持逻辑关系:

子串匹配也支持逻辑关系:

e_search('field: (abc OR xyz)')      # 字段field包含abc或xyz

e_search('field: (abc OR not xyz)')  # 字段field包含abc或不包含xyz

e_search('field: (abc && !xyz)')     # 字段field包含abc且不包含xyz

字段判断

使用搜索字符串对字段进行判断。

e_search('field: *'):字段存在。

e_search('not field:*'):字段不存在。

e_search('not field:""'):字段不存在。

e_search('field: "?"'):字段存在且值不为空。

e_search('field==""'):字段存在且值为空。

e_search('field~=".+"'):字段存在且值不为空。

e_search('not field~=".+"'):字段不存在或值为空。

e_search('not field==""'):字段不存在或值不为空。

场景示例

场景1

在日志中寻找某个字符串,并投递此日志

原始日志:

request_uri:/request/path-3/file-4

user_agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4

vpc_addr:210.46.240.91

vpc_id:3718

status:403



request_uri:/request/path-3/file-7

user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30

vpc_addr:36.42.106.228

vpc_id:7824

stauts:500




request_uri:/request/path-1/file-8

user_agent:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

vpc_addr:219.227.64.237

vpc_id:4961

status:200                      

                       

request_uri:/request/path-1/file-4

user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11

vpc_addr:218.7.163.232

vpc_id:7558

status:200

  • 加工目标:
  • 事件含有"Windows"或者"AppleWebKit"
  • 事件的status值等于200
  • 加工至target_logstore

DSL:

e_if(e_search("(Windows AppleWebKit) and status:200"), e_output(name="target_logstore"))

e_drop()




#亦可直接字段搜索:

e_search("(user_agent: AppleWebKit Windows) and status==200")

或者

e_search("user_agent== (AppleWebKit or Windows) and status:200")


场景2

根据日志字段的值,将日志分发到不同的logstore

原始日志:

request_uri:/request/path-3/file-4

user_agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4

vpc_addr:210.46.240.91

vpc_id:3718

status:502


request_uri:/request/path-3/file-7

user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30

vpc_addr:36.42.106.228

vpc_id:7824

status:403




request_uri:/request/path-1/file-8

user_agent:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

vpc_addr:219.227.64.237

vpc_id:4961

status:200

                       

                       

request_uri:/request/path-1/file-4

user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11

vpc_addr:218.7.163.232

vpc_id:7558

status:300

  • 加工目标:
  • 将code值为2xx的日志分发到logstore_2xx中
  • 将code值为3xx的日志分发到logstore_3xx中
  • 将code值为4xx的日志分发到logstore_4xx中
  • 将code值为5xx的日志分发到logstore_5xx中
  • DSL

#通配符匹配

e_switch(

   e_search("status== 2*"),

   e_output(name="logstore_2xx"),

   e_search("status== 3*"),

   e_output(name="logstore_3xx"),

   e_search("status== 4*"),

   e_output(name="logstore_4xx"),

   e_search("status== 5*"),

   e_output(name="logstore_5xx"),

   default=DROP,

)


#亦可使用 正则匹配:e_search('status~= "3\d+"'),

使用数据加工

1.选择需要被加工的日志所在的logstore,并进入数据加工:

2.编写DSL

3.预览加工结果:

3.保存数据加工,填写加工作业信息:




相关函数文档链接

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
70 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
11天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
118 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
11天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
35 2
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
46 2
|
2月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
195 3
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
160 0
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
57 0
|
15天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
128 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
231 3