开发者社区> 成喆> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

日志服务数据加工最佳实践: 事件判断

简介: 本篇介绍日志服务数据加工: 事件判断最佳实践汇总
+关注继续查看

场景1:判断字段是否存在

原始日志

a: a_vlue
b:    // 空串

LOG DSL编排

方案一:使用e_has, e_not_has

e_if(e_has("a"), e_set("has_a", true))
e_if(e_has("b"), e_set("has_b", true))
e_if(e_has("c"), e_set("has_c", true))
e_if(e_not_has("a"), e_set("not_has_a", true))
e_if(e_not_has("b"), e_set("not_has_b", true))
e_if(e_not_has("c"), e_set("not_has_c", true))

方案二:使用e_search

e_if(e_search("a: *"), e_set("has_a", true))
e_if(e_search("b: *"), e_set("has_b", true))
e_if(e_search("c: *"), e_set("has_c", true))
e_if(e_search("not a: *"), e_set("not_has_a", true))
e_if(e_search("not b: *"), e_set("not_has_b", true))
e_if(e_search("not c: *"), e_set("not_has_c", true))

加工后日志

a: a_vlue
b:    // 空串
has_a: true
has_b: true
has_c: false
not_has_a: false
not_has_b: false
not_has_c: true
  • 以上两种方案都可用于判断字段是否存在,但是方案一更直观、易理解。
  • 以上加工规则中的两个e_if可通过e_if(条件1,操作1,条件2,操作2)的形式合并为一个e_if,此处为了易于读者阅读,拆成两个。

场景2:判断字段值存在且不为空

原始日志

a: a_vlue
b:     // 空串

LOG DSL编排

方案一:使用字段取值函数v

e_if(v("a"), e_set("not_empty_a", true))
e_if(v("b"), e_set("not_empty_b", true))
e_if(v("c"), e_set("not_empty_c", true))
  • 字段取值函数v,当对应字段存在且值不为空时,其自动转换的Bool值为true,否则为false

方案二:使用e_search

# 至少一个字符
e_if(e_search('a: "?"'), e_set("not_empty_a", true))
e_if(e_search('b: "?"'), e_set("not_empty_b", true))
e_if(e_search('c: "?"'), e_set("not_empty_c", true))

# 正则
e_if(e_search('a~=".+"'), e_set("not_empty_a", true))
e_if(e_search('b~=".+"'), e_set("not_empty_b", true))
e_if(e_search('c~=".+"'), e_set("not_empty_c", true))

# 存在且不为空
e_if(e_search('a: * and not a==""'), e_set("not_empty_a", true))
e_if(e_search('b: * and not b==""'), e_set("not_empty_b", true))
e_if(e_search('c: * and not c==""'), e_set("not_empty_b", true))

加工后日志

a: a_vlue
b:     // 空串
not_empty_a: true
not_empty_b: false
not_empty_c: false
  • 以上三方案都可用于判断字段是否存在,但是方案一更简洁。
  • 以上加工规则中的两个e_if可通过e_if(条件1,操作1,条件2,操作2)的形式合并为一个e_if,此处为了易于读者阅读,拆成两个。

场景3:判断字段值存在但为空

原始日志

a: a_vlue
b:   // 空串

LOG DSL编排

方案一:使用字段取值函数v

e_if(op_and(e_has("a"), op_not(v("a"))), e_set("empty_a", true))
e_if(op_and(e_has("b"), op_not(v("b"))), e_set("empty_b", true))
e_if(op_and(e_has("c"), op_not(v("c"))), e_set("empty_c", true))

# 错误的方案
e_if(op_not(v("a")), e_set("empty_a", true))
e_if(op_not(v("b")), e_set("empty_b", true))
e_if(op_not(v("c")), e_set("empty_c", true))
  • 字段取值函数v,当对应字段存在且值不为空时,其自动转换的Bool值为true,否则为false. 但是只不存在是, 其返回None, op_not(None)时也是返回True.

方案二:使用e_search

e_if(e_search('a==""'), e_set("empty_a", true))
e_if(e_search('b==""'), e_set("empty_b", true))
e_if(e_search('c==""'), e_set("empty_c", true))

# 以下是错误调用
e_if(e_search('a:""'), e_set("empty_a", true))
e_if(e_search('b:""'), e_set("empty_b", true))

注意, 以上错误调用中, 因为:e_search是部分查询, 字段存在时, 无论是否空串的情况下, 空串a: ""永远会真.

加工后日志

a: a_vlue
b:    // 空串
empty_a: false
empty_b: true
empty_b: false
  • 以上方案中显然方案二更简洁.
  • 以上加工规则中的两个e_if可通过e_if(条件1,操作1,条件2,操作2)的形式合并为一个e_if,此处为了易于读者阅读,拆成两个。

场景4:基于字段值的逻辑查询判断

原始日志

"日志1"
http_host:  m1.abcd.com
status:  200
request_method:  GET
scheme:  https
header_length: 700
body_length: 1200

"日志2"
http_host:  m2.abcd.com
status:  200
request_method:  POST
scheme:  https
header_length: 100
body_length: 800

"日志3"
http_host:  m3.abcd.com
status:  200
request_method:  GET
scheme:  http
header_length: 700
body_length: 800

"日志4"
http_host:  m4.abcd.com
status:  404
request_method:  GET
scheme:  https
header_length: 100
body_length: 300

加工需求1

  • 为所有status字段值为200的日志事件, 添加一个字段type,其值为normal

LOG DSL编排

e_if(e_match("status", "200"), e_set("type", "normal))
或者
e_if(e_search("status==200"), e_set("type", "normal"))
  • 在此相对简单的场景下,以上两种方式都可以,并无太大差别。
  • 一般情况下status: 200也可以, 只是==更精准一些.

加工后的日志

"日志1"
type: normal
http_host:  m1.abcd.com
status:  200
request_method:  GET
scheme:  https
header_length: 700
body_length: 1200

"日志2"
type: normal
http_host:  m2.abcd.com
status:  200
request_method:  POST
scheme:  https
header_length: 100
body_length: 800

"日志3"
type: normal
http_host:  m3.abcd.com
status:  200
request_method:  GET
scheme:  http
header_length: 700
body_length: 800

"日志4"
http_host:  m4.abcd.com
status:  404
request_method:  GET
scheme:  https
header_length: 100
body_length: 300

加工需求2

  • 为所有status字段值为200 并且 request_method字段值为GET 并且 scheme字段值为https 的日志事件, 添加一个字段type,其值为normal

LOG DSL编排

e_if(e_search("status==200 and request_method==GET and scheme==https"), e_set("type", "normal"))
或者
e_if(e_match_all("status", "200", "request_method","GET", "scheme", "https"), e_set("type", "normal"))
  • 在此场景下,需要同时满足多个字段的匹配条件,可以使用e_searche_match_all
  • e_search用法相对更简洁一些。
  • 一般情况下e_search==也可以换成:status: 200也可以, 只是==更精准一些.

加工后的日志

"日志1"
type: normal
http_host:  m1.abcd.com
status:  200
request_method:  GET
scheme:  https
header_length: 700
body_length: 1200

"日志2"
http_host:  m2.abcd.com
status:  200
request_method:  POST
scheme:  https
header_length: 100
body_length: 800

"日志3"
http_host:  m3.abcd.com
status:  200
request_method:  GET
scheme:  http
header_length: 700
body_length: 800

"日志4"
http_host:  m4.abcd.com
status:  404
request_method:  GET
scheme:  https
header_length: 100
body_length: 300

加工需求3

  • 为所有status字段值为200 或者 request_method字段值为GET 或者 scheme字段值为https 的日志事件, 添加一个字段type,其值为normal

LOG DSL编排

e_if(e_search("status==200 or request_method==GET or scheme==https"), e_set("type", "normal"))
或者
e_if(e_match_any("status", "200", "request_method","GET", "scheme", "https"), e_set("type", "normal"))
  • 在此场景下,需要满足多个字段的匹配条件中的其中一个,可以使用e_searche_match_any
  • e_search用法相对更简洁一些。

加工后的日志

"日志1"
type: normal
http_host:  m1.abcd.com
status:  200
request_method:  GET
scheme:  https
header_length: 700
body_length: 100

"日志2"
type: normal
http_host:  m2.abcd.com
status:  200
request_method:  POST
scheme:  https
header_length: 100
body_length: 800

"日志3"
type: normal
http_host:  m3.abcd.com
status:  200
request_method:  GET
scheme:  http
header_length: 700
body_length: 800

"日志4"
type: normal
http_host:  m4.abcd.com
status:  404
request_method:  GET
scheme:  https
header_length: 100
body_length: 1300

加工需求4

  • 为所有status字段值为200 并且 request_method字段值为GET 并且 header_lengthbody_length的字段值之和小于等于1000的日志事件, 添加一个字段type,其值为normal

LOG DSL编排

e_if(op_and(e_search("status: 200 and request_method: GET"), op_le(op_sum(v("header_length"), v("body_length")), 1000)), e_set("type", "normal"))
  • 在更复杂的逻辑场景下,可通过e_search和其他表达式函数的组合来完成。

加工后的日志

"日志1"
type: normal
http_host:  m1.abcd.com
status:  200
request_method:  GET
scheme:  https
header_length: 700
body_length: 100

"日志2"
http_host:  m2.abcd.com
status:  200
request_method:  POST
scheme:  https
header_length: 100
body_length: 800

"日志3"
http_host:  m3.abcd.com
status:  200
request_method:  GET
scheme:  http
header_length: 700
body_length: 800

"日志4"
http_host:  m4.abcd.com
status:  404
request_method:  GET
scheme:  https
header_length: 100
body_length: 1300

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
日志服务数据加工最佳实践: 多子键为数组的复杂JSON加工
程序构建的日志经常会以一种统计性质的JSON格式写入, 通常其包含一个基础信息, 以及多个子健为数组的形式. 本篇如何使用日志服务数据加工处理多子键为数组的复杂JSON.
958 0
日志服务数据加工最佳实践: 加工多层数组对象嵌套的复杂JSON
许多程序的数据结构是一个复杂的包括多层数组嵌套的对象, 本篇介绍使用日志服务数据加工处理多层数组对象嵌套的复杂JSON.
1169 0
日志服务数据加工最佳实践: 构建字典与表格做数据富化
本篇介绍日志服务数据加工最佳实践: 构建字典与表格做数据富化, 覆盖多种方式: 直接, 任务配置, 字典表格函数, RDS-MySQL, 其他Logstore等
1476 0
日志服务数据加工最佳实践: 从RDS-MySQL拉取数据做富化
本篇覆盖日志服务数据加工最佳实践: 从RDS-MySQL拉取数据做富化的各种场景, 包括定期刷新拉取所有, 拉取部分数据, 拉取后再过滤数据, 调整返回表格结构等
1641 0
【大数据新手上路】“零基础”系列课程--日志服务(Log Service)采集 ECS 日志数据到 MaxCompute
本实验通过日志服务采集ECS日志数据并离线同步到MaxCompute,帮助用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值 。
4126 0
如何将日志服务的数据秒级同步到表格存储
最近在容器服务的官方镜像中,新增了loghub-shipper的镜像,使用该镜像,可以订阅日志服务中的日志库,以秒级的延时将日志数据从日志服务中读出并转换成结构化数据存储在表格存储中,以满足实时在线服务的精确查询需求。
6765 0
日志服务(原SLS)新功能发布(6)--使用logtail接入syslog数据
Logtail 是日志服务(原SLS)客户端,支持文本类日志数据的收集。考虑到syslog功能是linux平台上广泛使用的日志集中化管理方案,新版本的Logtail将支持syslog数据接入.
5991 0
日志服务(原SLS)新功能发布(5)--使用Logstash接入数据
日志服务结合Logstash 目前,阿里云用户可以通过API/SDK或Logtail将数据写入日志服务,参考。 今天要介绍一个新方法:使用著名开源软件Logstash采集机器日志数据,并结合日志服务插件完成数据上传日志服务功能。
7426 0
日志服务数据导入-2
日志服务数据导入-2
35 0
+关注
成喆
不忘初心 方得始终
文章
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲
立即下载
Python第四讲——使用IPython/Jupyter Notebook与日志服务玩转超大规模数据分析与可视化
立即下载
yqdh_58c1349b15e...1510470348.pdf
立即下载