日志服务数据加工:快速开始(SLB日志加工实战)-阿里云开发者社区

开发者社区> 成喆> 正文

日志服务数据加工:快速开始(SLB日志加工实战)

简介: 日志服务数据加工上线,本文以SLB日志加工实战为例,覆盖规则编写、控制台交互、权限配置、监控排错等
+关注继续查看

背景

这里我们拿一个Logstore中的网关数据(阿里云SLB日志)举例,对其数据进行加工并分发到不同的Logstore中。

数据

源logstore(slb-log)的数据内容是一个阿里云SLB的网络日志,格式样例如下:

__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
http_referer:  -
http_x_forwarded_for:  -
http_x_real_ip:  -
read_request_time:  0
request_length:  0
request_method:  GET
request_time:  0.000
request_uri:  /category/abc/product_id?id=75&type=2&sam=123
scheme:  https
server_protocol:  HTTP/2.0
slb_vport:  443
slbid:  lb-1234
ssl_cipher:  ECDHE-RSA-AES128-GCM-SHA256
ssl_protocol:  TLSv1.2
status:  200
tcpinfo_rtt:  58775
time:  2019-06-06T13:44:50+08:00
upstream_addr:  1.2.3.4:80
upstream_response_time:  4.1234
upstream_status:  200
vip_addr:  1.2.3.4
write_response_time: 4.1234

目标

这里我们希望对数据进行如下加工,获取三份数据:

分发

  1. 将所有status非2XX或者3XX的请求,复制一份到目标logstore: slb-log-error中,日志时间180天,以便进一步做研发与安全类分析,__topic__设置为slb_error
  2. 将所有不那么重要的图片或静态资源的请求日志,分发到目标logstore: slb-log-media,日志保存30天, topic设置为slb_media_request
  3. 其他的请求日志,用于进一步分析统计业务对接的,分发到目标logstore: slb-log-normal,日志保存90天,topic设置为slb_normal

转换

  1. slb_media_request的请求
  • 提取如下字段
object_file=app.icon
object_type = icon   # css, jpeg, js 等
  • 保留如下字段:
http_referer:  -
body_bytes_sent:  740
client_ip:  1.2.3.4
host:  m.abcd.com
request_time:  4.33
  1. slb_normal请求
  • 保留如下字段
body_bytes_sent:  740
client_ip:  1.2.3.4
host:  m.abcd.com
http_referer:  -
http_x_real_ip:  -
request_length:  0
request_method:  GET
request_time:  4.33
request_uri:  /category/abc/product_id?id=75&type=2&sam=123
scheme:  https
slb_vport:  443
slbid:  lb-1234
status:  200
time:  2019-06-06T13:44:50+08:00
  • 提取request_uri的参数加上前缀reqparam_
reqparam_id: 75
reqparam_type: 2
reqparam_sam: 123
  • http_x_real_ip如果为空或者-时,填上client_ip的值
  • 提取host中的domain值:
domain:  abcd

准备工作

目标logstore准备

  1. 创建好如下3个logstore
slb-log-normal  # 日志保存90天,逻辑命名定为target0
slb-log-error    # 日志保存180天,逻辑命名定为target1
slb-log-media  # 日志保存30天, 逻辑命名定为target2
  1. 并各自配置好索引
    点击每个logstore的【查询】页面的【索引】设置,并根据每个logstore存储的日志的字段,配置相应的索引。也可以使用CloudShell中的CLIcopy_logstore子命令来从源logstore复制一份索引到目标,再进行调整来简化操作。

权限秘钥准备

当前操作需要授权以便读取源logstore或写入目标logstore

  • 通过AK秘钥授权
  • 通过角色授权(二期会支持)

需要准备好一个或多个(每个logstore对应一个)AK秘钥访问:

源logstore的最小RAM授权

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "log:ListShards",
        "log:GetCursorOrData",
        "log:GetConsumerGroupCheckPoint",
        "log:UpdateConsumerGroup",
        "log:ConsumerGroupHeartBeat",
        "log:ConsumerGroupUpdateCheckPoint",
        "log:ListConsumerGroup",
        "log:CreateConsumerGroup"
      ],
      "Resource": [
        "acs:log:*:*:project/源project/logstore/slb-log",
    "acs:log:*:*:project/源project/logstore/slb-log/*"
      ],
      "Effect": "Allow"
    }
  ]
}

目标logstore的最小RAM授权

{
  "Statement": [
    {
      "Action": [
        "log:Post*"
      ],
      "Effect": "Allow",
      "Resource": [ "acs:log:*:*:project/目标Project/logstore/slb-log-error", "acs:log:*:*:project/目标Project/logstore/slb-log-media", "acs:log:*:*:project/目标Project/logstore/slb-log-normal"]
    }
  ],
  "Version": "1"
}

也可以考虑将这两个授权合并成一个以便简化操作。

配置加工任务

进入加工规则界面

  1. 在日志服务列表中,选择源logstore(slb-log)的数据接入右边的+号直接进入加工模式.

image

  1. 进入交互的加工界面
    在 #1 中选择日期的时间,例如【今天】,确保能够看到数据:

image

复制失败的请求日志到sbl-log-error

在编辑框中输入如下的规则(关于语法说明,可参考后续的章节):

e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))
e_drop()

再点击【预览数据】,会弹窗提示输入访问源logstore的AK秘钥,输入前面准备好的AK秘钥:
image

等待一会儿之后,可以在【数据加工】标签页中看到结果中,所有非2XX/3XX的请求会被输出到target1的目标中,且topic设置为了slb_error
image

提取静态类请求日志并输出到sbl-log-media

在规则编辑框中更新如下规则(关于语法说明,可参考后续的章节):

# e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))

e_regex("request_uri", r"([\.\w]+\.\w+)", "object_file")
e_regex("object_file",  r"(\w+)$", "object_type")
e_if(v("object_file"), e_compose(e_keep_fields(F_META, r"object_\w+|request_uri|client_ip|host|request_time"), 
                                                                 e_output(name="target2", topic="slb_media_request")))

e_drop()

再点击【预览数据】,等一会,可以在【数据加工】标签页中看到结果,静态类请求将会被输出到target2的目标中。如前面需求描述,特定的字段被提取,并且还新增了2个字段object_fileobject_type,并且topic设置为了slb_media_request
image

调整字段并输出正常请求日志到sbl-log-normal

在编辑框中更新如下规则(关于语法说明,可参考后续的章节):

# e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))

# e_regex("request_uri", r"([\.\w]+\.\w+)", "object_file")
# e_regex("object_file",  r"(\w+)$", "object_type")
# e_if(v("object_file"), e_compose(e_keep_fields(F_META, r"object_\w+|request_uri|client_ip|host|request_time"), 
#                                                                  e_output(name="target2", topic="slb_media_request")))

e_set("__topic__", "slb_normal")
e_kv("request_uri", prefix="reqparam_")
e_if(op_eq(v("http_x_real_ip"), "-"), e_set("http_x_real_ip", v('client_ip')))
e_keep_fields(F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length", 
                                       "request_method|request_time|request_uri|scheme|slb_vport|slbid|status")

再点击【预览数据】,等一会,可以在【数据加工】标签页中看到结果,非媒体类请求将被输出到target0的目标中,如前面需求描述,特定的字段被提取,并且字段http_x_real_ip被设置成了非-的值,且topic设置为了slb_normal
image

保存配置

最终加工规则
在确认规则正确后,去掉注释的部分,就是完整版本:

e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))

e_regex("request_uri", r"([\.\w]+\.\w+)", "object_file")
e_regex("object_file",  r"(\w+)$", "object_type")
e_if(v("object_file"), e_compose(e_keep_fields(F_META, r"object_\w+|request_uri|client_ip|host|request_time"), 
                                                                 e_output(name="target2", topic="slb_media_request")))

e_set("__topic__", "slb_normal")
e_kv("request_uri", prefix="reqparam_")
e_if(op_eq(v("http_x_real_ip"), "-"), e_set("http_x_real_ip", v('client_ip')))
e_keep_fields(F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length", 
                                       "request_method|request_time|request_uri|scheme|slb_vport|slbid|status")

配置目标

点击【保存加工配置】,在配置中,依据前面的需求,配置源logstore的秘钥(预览的时候已经配置了),以及3个目标logstore的Project名、logstore名和写入的AK秘钥。注意3个目标的逻辑名称需要与规则中应用的规则保持一致。

image

配置加工范围
在加工范围中,可以根据情况选择【所有】、【某个时间开始】或者特定范围,这里选择【某个时间开始】,并选择此刻。那么保存后,新写入源logstore的数据将会自动应用规则写入到配置的3个目标去。
注意, 这里的时间是日志接收时间

image

加工任务管理与监控

任务管理

点击日志服务项目页面的左侧导航栏中的【数据加工】,可以看到保存的加工任务,可以根据情况选择修改、停止、重启等操作。
image

规则洞察

对于数据加工的任务详情中下方就是任务的执行状态:
image
image

语法详细说明

第一次预览操作

规则

e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))
e_drop()

说明

  1. 这里使用条件判断e_if(条件,操作),当条件e_match为真时,执行操作e_coutput
  • 操作e_match("status", r"4\d+|5\d+")检查日志的status字段值是否为4XX或5XX的形式;Python语法中,字符串前面用r修饰,可以避免写两个\的麻烦。
  • 操作:e_coutput('target1', topic="slb_error") 表示复制一份数据并输出到目标target1中,并且将topic设置为slb_error
  1. 函数e_drop()表示丢弃所有剩余的日志;这里是为了预览的效果特意加上,实际保存的配置中不会有这句话。

第二次预览操作

规则

# e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))

e_regex("request_uri", r"([\.\w]+\.\w+)", "object_file")
e_regex("object_file",  r"(\w+)$", "object_type")
e_if(v("object_file"), e_compose(e_keep_fields(F_META, r"object_\w+|request_uri|client_ip|host|request_time"), 
                                                                 e_output(name="target2", topic="slb_media_request")))

e_drop()

详细说明

  1. 操作e_regex()表示从字段request_uri中提取了字段object_file,然后进一步从object_file中提取了object_type,如果object_file不存在,字段object_type也不会存在。
  2. e_compose(操作1,操作2)对两个操作进行组合,依次执行。e_if(条件,e_compose(操作1,操作2))表示对于字段object_file不为空的事件,保留特定字段,并且输出到target2,由于这里使用的是e_output而非e_coutput,因此这些事件被输出后不再后续处理。
  3. 规则中的第一行步骤使用Python的语法方式#注释掉了,保留最后一行e_drop()的目的是方便预览。

第三次预览操作

规则

# e_if(e_match("status", r"4\d+|5\d+"), e_coutput("target1", topic="slb_error"))

# e_regex("request_uri", r"([\.\w]+\.\w+)", "object_file")
# e_regex("object_file",  r"(\w+)$", "object_type")
# e_if(v("object_file"), e_compose(e_keep_fields(F_META, r"object_\w+|request_uri|client_ip|host|request_time"), 
#                                                                  e_output(name="target2", topic="slb_media_request")))

e_set("__topic__", "slb_normal")
e_kv("request_uri", prefix="reqparam_")
e_if(op_eq(v("http_x_real_ip"), "-"), e_set("http_x_real_ip", v('client_ip')))
e_keep_fields(F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length", 
                                       "request_method|request_time|request_uri|scheme|slb_vport|slbid|status")

详细说明

  1. 操作e_set()设置默认事件的__topic__
  2. 操作e_kv(),对字段request_uri的值进行KV操作,自动提取其中的键值对并放到事件中。
  3. 进一步的基于表达式函数op_eq设置了字段http_x_real_ip的值。最后e_keep_fields保留特定字段。
  4. 这里没有使用e_output()等,因为默认会将事件输出到第一个配置的目标target0中。

进一步参考

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

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

相关文章
基于日志服务(SLS)实现电商数据加工与分析
基于日志服务(SLS)实现电商数据加工与分析 本文要点(json函数、ip映射函数专题) 如何使用阿里云日志服务-数据加工做清洗数据 如何使用阿里云日志服务强大的SQL做数据分析 如何配置数据仪表大盘 日志数据样例 本文中的日志数据,以某大型电商一段时间的成交量数据为背景来展开工作的。
1695 0
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
4843 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8467 0
开发者学堂课程干货总结——Spring Cloud微服务架构设计与开发实战(十四)
Spring Cloud微服务架构设计与开发实战课时2.3—开发Spring Cloud微服务并注册到注册中心 。Java Spring Cloud是全球范围内最成熟、最完善、最流行的微服务架构方案体系。被众多的互联网大公司采用,包括阿里巴巴、腾讯、支付宝、网易、IBM、谷歌、京东、百度、滴滴等。电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!
80 0
redis数据结构实现--压缩列表(ziplist)
redis数据结构实现(六) 压缩列表(ziplist)是链表键和哈希键的底层实现之一。当链表键或哈希键只有少量列表项,且列表项中是小整数值或短字符串,则会采用压缩列表作为底层实现。 6.1 压缩列表的实现 压缩列表是为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构。
2051 0
日志服务与SIEM(如Splunk)集成方案实战
本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 注意:相关代码已经正式发布为Splunk采集插件,推荐直接访问下载使用:https://splunkbase.splunk.com/app/4934/
11813 0
日志服务数据加工培训直播资料汇总: 扫平日志分析路上障碍, 实时海量日志加工实践
日志服务数据加工系列培训资料汇总: 扫平日志分析路上障碍, 实时海量日志加工实践
1321 0
日志服务(SLS)数据加工功能发布
日志服务用户,您好! 针对日志生命周期内存在的各种数据规整、分发、富化、清洗场景需求,阿里云日志服务(SLS)新推出了“数据加工”功能。 推荐在日志服务上进行数据规整、加工或联合其它数据源做分析的数据工程师使用。
6614 0
iOS网络编程-iCloud键值数据存储编程实例
<p><strong>iCloud键值数据存储设计</strong></p> <p>iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击“设置iCloud数据”按钮,将控件状态保存到iCloud服务器。右图是设备2画面,过几秒钟后设备2收到变更通知。</p> <p align="center"> <a href="http://www.iosbook3.com/wp-con
1272 0
+关注
成喆
不忘初心 方得始终
101
文章
2
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载