背景介绍
什么是日志服务?
日志服务是针对日志类数据的一站式服,像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
逻辑关系
支持任意搜索之间的逻辑关系,也支持用圆括号()进行嵌套。
逻辑关系 |
关键字 |
且 |
and,AND,&&等,不区分大小写。 |
或 |
or,OR等,不区分大小写。 |
否 |
not,NOT,!等,不区分大小写。 |
示例:
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.保存数据加工,填写加工作业信息: