本文档以阿里云SLB日志为例,为您介绍完整的数据加工流程,帮助您快速熟悉数据加工功能和操作。

背景信息

此处我们以Logstore中的网关数据举例,对其数据进行简单的数据加工并分发到不同的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/s?q=asd&a=1&b=2
status:  200

准备工作

  • 目标Logstore准备。

    根据需求规划源Logstore与目标Logstore,具体请参见性能指南成本优化指南

    例如创建如下两个Logstore。
    slb-log-success  # 日志保存90天,逻辑命名定为target0。
    slb-log-fail     # 日志保存180天,逻辑命名定为target1。

    配置索引。

    请参见开启并配置索引,并根据每个Logstore存储的日志的字段,配置相应的索引。

  • 权限密钥准备。
    当前操作需要授权以便读取源Logstore数据或将数据写入目标Logstore。
    • 源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"
      }

    也可以将两个授权合并为一个以简化操作。关于授权操作请参见访问密钥配置

数据加工

  • 原始日志
    """
    第一条日志
    """
    __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
    
    ...
  • 需求
    • 针对不同的status设置不同的事件主题,并且分发到不同的Logstore中。
    • 拆分http_host的kv信息。
  1. 进入加工页面。
    在日志库列表中,单击源Logstore(slb-log)中加工后的加号进入数据加工页面。配置加工任务

    在数据加工界面中选择日期时间,确保能够看到日志数据。

  2. 创建加工规则。
    1. 在编辑框中输入如下的规则。
      e_kv("http_host")
      e_if(e_search("status==200"),e_compose(e_set("__topic__","login_success_event"),e_output(name="200-target", project="project1", logstore="200_log")))
      e_if(e_search("status==400"),e_compose(e_set("__topic__","login_fail_event"),e_output(name="400-target", project="project1", logstore="400_log")))
      规则说明
      • e_kv函数,对http_host进行提取kv类型值。例如把m.abcd.com/s?q=asd&a=1&b=2提取成如下格式。
        http_host: m.abcd.com/s?q=asd&a=1&b=2
        q: asd
        a: 1
        b: 2
      • 条件判断e_if(条件,操作),当条件e_search为真时,执行操作e_compose。
        • 操作e_search("status==200")检查日志的status字段值是否等于200。
        • 操作e_compose(操作1,操作2)对两个操作进行组合,依次执行。

        首先执行e_set()函数将__topic__字段信息设置为login_success_event,再执行e_output函数。e_output函数表示输出事件到配置的特定目标,并配置输出时的topic、source、标签等信息。预览时不会输出到目标Logstore,而是输出到预览的临时Logstore,并附加非预览时目标的信息。

      关于函数更详细的介绍请参见函数介绍语法简介
    2. 单击预览数据,会弹框提示输入访问源Logstore的AK密钥,请输入前面准备好的密钥。
    3. 数据加工页签中查看结果。

      所有200请求会被输出到200_log目标中,且Topic设置为login_success_event

      所有400请求会被输出到400_log目标中,且Topic设置为login_fail_event

      加工结果
  3. 保存加工规则。
    单击保存数据加工,配置源Logstore的密钥,以及2个目标Logstore的Project名、Logstore名和写入的AK密钥。设置加工范围。保存加工配置
    说明
    • e_output中的name值需要跟截图中的目标名称对应,其余的目标Project、目标Logstore都填入截图中以下对应的位置。
    • e_output函数将处理完成的数据写入到目标Logstore中。
    • e_compose函数里面能够执行多个动作,具体请参见e_compose
    • 加工范围中设置的时间是日志接收时间。
  4. 查看加工任务。
    • 单击日志服务项目页面左侧导航栏中的数据加工图标,查看保存的加工任务。可以根据情况选择修改、停止、重启等操作。任务管理
    • 在数据加工的任务详情下方查看任务的执行状态。规则洞察

      更多关于仪表盘的介绍请参见数据加工仪表盘

函数介绍

  • 基础阶段
    • e_set的使用。
      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"))
        预览时日志内容中会把status值赋值给result字段,如下所示。
        __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
    • e_rename的使用。
      e_rename是对多字段进行重命名的操作函数,具体请参见e_rename
      • 对单一字段进行重命名操作。例如将client_ip重名为ip。
        e_rename("client_ip","ip")
        预览时日志内容中会把client_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")
        预览时日志内容中会把client_ip重命名为ip字段,body_bytes_sent重命名为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
    • 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_field函数,删除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_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的数据提取出来。
      __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_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
      
      """
      第二条日志已经被丢弃掉了
      """