本文以阿里云SLB日志为例,为您介绍完整的数据加工流程,帮助您快速熟悉数据加工功能及其操作。
前提条件
背景信息
- 数据加工需求
- 针对不同状态的日志设置不同的事件主题,并且分发到不同的Logstore中。
- 拆分http_host字段中的kv信息。
- 日志样例
""" 第一条日志 """ __source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 """ 第二条日志 """ __source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 400 ...
创建数据加工任务
函数介绍
- 基础阶段
- e_set()函数的使用。
e_set()函数用于更新事件字段的值,详情请参见e_set。
- 在日志中添加新字段并设置新的值,例如设置一个province字段。
e_set("province","上海")
预览时,日志中显示province字段信息。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 province: 上海
- 复制日志中status字段的值,并赋值给一个新的字段。例如调用复制函数V,将status字段的值,赋值给result字段。
e_set("result",v("status"))
预览时,日志中显示result字段,并且其值与status字段的值相同,如下所示。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 result: 200
- 在日志中添加新字段并设置新的值,例如设置一个province字段。
- e_rename()函数的使用。
e_rename()函数用于重命名字段,具体请参见e_rename。
- 对单一字段进行重命名操作。例如将client_ip重命名为ip。
e_rename("client_ip","ip")
预览时,日志中显示ip字段。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200
- 对多个字段进行重命名操作。例如将client_ip重命名为ip,将body_bytes_sent重命名为bytes_content。
e_rename("client_ip","ip","body_bytes_sent","bytes_content")
预览时,日志中显示ip字段和bytes_content字段。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: bytes_content: 740 ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200
- 对单一字段进行重命名操作。例如将client_ip重命名为ip。
- e_keep_fields()函数和e_drop_fields()函数的使用。
e_keep_fields()函数用于保留符合条件的字段,详情请参见e_keep_fields。
e_drop_fields()函数代表删除符合条件的字段,详情请参见e_drop_fields。
- 使用e_keep_fields()函数,保留status字段信息。
说明 __source__和__topic__字段不允许被删除。
e_keep_fields("status")
预览时,日志中保留status字段。__source__: __topic__: status: 200
- 使用e_drop_fields()函数,删除http_host字段信息。
e_drop_fields("http_host")
预览时,日志中已删除http_host字段。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: bytes_content: 740 ip: 1.2.3.4 host: m.abcd.com status: 200
- 使用e_keep_fields()函数,保留status字段信息。
- e_set()函数的使用。
- 中级阶段
- e_if()函数和e_search()函数的使用。
e_if()函数是条件与操作的配对组合,根据条件进行判断,满足条件的依次执行相应操作。不满足条件的不执行对应操作,进行下一个条件判断。对于某一条事件,如果其中某一步操作删除了事件,则不会再对其执行后续操作。
e_search()函数使用查询字符串,判断事件的字段值是否满足特定条件,返回True或False。
字段的值匹配后执行操作。例如:判断status字段的值是否为200,并且设置事件主题为login_success_event。e_if(e_search("status==200"), e_set("__topic__", "login_success_event"))
预览时,日志中的__topic__显示为login_success_event。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: login_success_event body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200
- e_kv()函数使用。
e_kv()函数表示通过quote等自动提取多个源字段中的键值对信息,详情请参见e_kv。
从URL中提取kv格式的数据,例如使用e_kv()函数提取http_host字段中的kv数据。e_kv("http_host")
预览时,日志中会提取http_host字段中的kv数据。__source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 q: asd a: 1 b: 2
字段提取函数除了e_kv(),还有e_regex()、e_kv_delimit()、e_json()等提取函数,具体请参见字段值提取函数。
- e_if()函数和e_search()函数的使用。
- 高级阶段
高级阶段为e_if()、e_search()、e_drop()和e_keep()的综合使用。
对status字段的值是200的日志,进行保留事件处理。对status字段的值是400的日志,进行丢弃事件处理。
- 原始日志
""" 第一条日志 """ __source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 """ 第二条日志 """ __source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 400
- 加工处理
e_if(e_search("status==400"),e_drop()) e_if(e_search("status==200"),e_keep())
- 加工结果
""" 第一条日志 """ __source__: log_service __tag__:__receive_time__: 1559799897 __topic__: body_bytes_sent: 740 client_ip: 1.2.3.4 host: m.abcd.com http_host: m.abcd.com/s?q=asd&a=1&b=2 status: 200 """ 第二条日志已经被丢弃 """
- 原始日志