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

前提条件

  • 已采集阿里云SLB日志到日志服务并保存于Logstore(以slb-log为例)中。
  • 已创建目标Logstore,例如有如下两个目标Logstore。
    • Logstore名为200_log,日志保存90天,目标名称为200-target。
    • Logstore名为400_log,日志保存180天,目标名称为400-target。

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

  • 已为源Logstore和目标Logstore开启索引,详情请参见开启并配置索引

背景信息

源Logstore(slb-log)中的数据为阿里云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
    
    ...

创建数据加工任务

  1. 登录日志服务控制台
  2. Project列表区域,单击目标Project。
  3. 进入数据加工模式。
    您可以通过以下两种方式进入数据加工模式。
    • 日志管理 > 日志库页签中,单击目标Logstore。在查询分析页面,开启数据加工,进入数据加工模式。
    • 日志管理 > 日志库页签中,单击目标日志库前的>,依次选择数据处理 > 加工。单击加工后的加号(+),进入数据加工模式。
  4. 在数据加工页面中选择日志接收时间。
    请确保在数据加工页签中有日志数据。
  5. 在编辑框中输入加工规则。
    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("status==200")检查status字段的值是否等于200。
      • 执行e_compose(操作1,操作2)对两个操作进行组合,依次执行。

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

    加工函数详情请参见数据加工语法

  6. 预览数据。
    您可以通过快速预览、高级预览方式预览数据,详情请参见预览调试
  7. 查看预览结果。
    • status为200的日志被输出到200_log目标中,且Topic设置为login_success_event
    • status为400的日志输出到400_log目标中,且Topic设置为login_fail_event
    加工结果
  8. 保存加工规则。
    1. 单击保存数据加工
    2. 创建数据加工规则页面,配置如下参数。
      保存加工配置
      • 目标名称配置为e_output()函数中name的值、目标Project配置为e_output()函数中project的值,目标库配置为e_output()函数中Logstore的值。其他参数配置请参见创建数据加工任务
      • e_output()函数将加工数据写入到目标Logstore中。
      • e_compose()函数支持执行多个动作,详情请参见e_compose
  9. 查看加工任务。
    1. 在左侧导航栏中,单击数据加工-001,进入数据加工列表。
    2. 单击目标数据加工任务。
    3. 数据加工概览页面,您可以执行如下操作。
      • 根据需求,查看、修改、停止、重启或删除数据加工任务。任务管理
      • 查看数据加工任务仪表盘,详情请参见数据加工仪表盘规则洞察

函数介绍

  • 基础阶段
    • 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
    • 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
    • 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字段中的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_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
      
      """
      第二条日志已经被丢弃
      """