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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 日志服务数据加工上线,本文以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

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
11天前
|
人工智能 数据可视化 开发工具
Git log 进阶用法(含格式化、以及数据过滤)
Git log 进阶用法(含格式化、以及数据过滤)
|
1天前
|
监控 NoSQL MongoDB
mongoDB查看数据的插入日志
【5月更文挑战第2天】mongoDB查看数据的插入日志
24 0
|
6天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
6天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1
|
7天前
|
弹性计算 运维 Shell
|
13天前
|
机器学习/深度学习 前端开发 数据挖掘
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断(下)
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
|
14天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
16 0
|
17天前
|
SQL 存储 监控
SLS 查询新范式:使用 SPL 对日志进行交互式探索
像 Unix 命令一样支持多级管道级联,像加工预览一样实时处理查询结果,更便捷的交互,更丰富的算子,更灵活的探索半结构化日志,快来试试使用 SPL 语言查询日志数据吧~
|
18天前
|
Apache
web服务器(Apache)访问日志(access_log)详细解释
web服务器(Apache)访问日志(access_log)详细解释
|
18天前
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断2
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断

相关产品

  • 日志服务