多模式日志数据流的实时加工与集散

概述

日志是我们在做系统运维时最重要的信息之一,其最大的优点是简单直接。不过在整个日志的生命周期里有这么一对很难调和的矛盾:输出和采集日志要求尽可能的简单便捷 vs 日志分析时需要数据格式化并能够按需存储。为了保证服务端的稳定,我们往往会将多种模式的日志数据采集到到统一的存储目标中(即更加偏向于矛盾前者),其原因也比较明显:

  • 业务系统在写日志时混合输出,采集端无法识别。这种情况十分常见,不同的代码风格、或者系统初期考虑不周等等都会出现。
  • 日志采集端做统一采集。这种情况一方面简化采集配置,方便管理;另一方面简单的采集过程也可以减少对业务服务器的压力。

随着日志应用场景越来越广,甚至很多已经将业务数据写入日志用于业务分析,以上矛盾越来越显现。为了能够尽量解决如上所述的输出加采集和分析之间的矛盾,一般会在使用日志数据分析前做预加工。针对如上的多模式数据计算,需要能满足如下2个需求:

  1. 不同的模式的数据需要使用其相应的计算逻辑,并分散输出到特定的下游目标中,以供特定的业务分析使用
  2. 多模式参数实现配置化,但需要增加新模式时不需要重启计算任务,而是直接修改配置即可生效

SLS 数据加工

阿里云 SLS 数据加工服务是专注于日志实时处理的平台,其主要特点是免运维、低代码。这里,我们看下如何使用 SLS 数据加工服务解决上文所述的多模式数据混合存储的场景需求。下文会使用阿里云 SLS 的术语,可参考其文档

多模式日志数据流的实时加工与集散
如上图所示,如下是完整的日志数据链路:

  1. 业务系统包括3个模块A、B、C,其中A和B在同一台服务器上,日志输出到了同一个文件中。但是三个模块输出的日志模式是完全不一样(如下文)。
  2. 为了简化日志输出和采集,不对服务日志输出模式做调整,并将所有日志统一采集到到 logstore-0 中。该 logstore 用于存储原始数据,无法直接做分析使用。
  3. logstore-0 之上配置数据加工,数据加工需要完成3个需求:
    a. 获取日志模式配置,该配制可以存储在阿里云 OSS或者 RDS 中
    b. 针对数据应用相应的模式参数做解析
    c. 将解析后的数据输出到其特定的目标中
  4. 以上所有配置以后,就可以在对应的目标 logstore 中做相应的分析。其中A和B是提供业务人员直接在SLS上做统计分析,C则进一步进入数据下游。

这里假设A、B、C 3种数据模式都是 csv 格式,其数据列和分隔符都不一样,其处理结果最终需要分别输出到不同的 logstore 中:logstore-Alogstore-Blogstore-C。不同的日志模式配下:

A => #fields:"x,y,z" #sep:"," #target:"logstore-A"
B => #ields:"u,v"    #sep:"|" #target:"logstore-B"
C => #fields:"r,s,t" #sep:" " #target:"logstore-C"

配置详情

这里直接演示在阿里云控制台的配置详情。首先,我们需要准备数据模式。如上文所说,我们可以将模式存储在阿里云 OSS 或者 RDS 中,这里以 OSS 存储为例。将上文所说的模式打包成 JSON 文件 schemas.json,并上传至 OSS bucket 中,获取拥有读取该 bucket 权限的 access key,操作细节可参考 OSS 文档。模式文件内容参考如下:

{
  "A": {
    "fields": ["x", "y", "z"],
    "sep": ",",
    "target": "logstore-A"
  },
  "B": {
    "fields": ["u", "v"],
    "sep": "|",
    "target": "logstore-B"
  },
  "C": {
    "fields": ["r", "s", "t"],
    "sep": " ",
    "target": "logstore-C"
  }
}

接下来需要在 SLS 控制台配置数据加工。配置细节可以参考其 快速入门调试指南,这里主要介绍本文主题相关的配置。logstore-0 中原始数据如下图,所有数据信息都包含在 content 字段中,需要从中提取详细的字段:
多模式日志数据流的实时加工与集散

数据加工脚本如下,其是遵循 Python 语法的 DSL,其逻辑相比于直接编程实现有极大的简化:

e_set("schema_name", lst_get(str_split(v("content"), sep=":"), 0))
e_set("content", lst_get(str_split(v("content"), sep=":"), 1))
e_set(
    "schemas",
    res_oss_file(
        "oss-cn-shanghai.aliyuncs.com",
        "<access-key-id>",
        "<access-key-secret>",
        "<oss-bucket-name>",
        "schemas.json",
        format="json",
        change_detect_interval=3600,
    ),
)
e_set("schema", dct_get(v("schemas"), v("schema_name")))
e_csv("content", dct_get(v("schema"), "fields"), sep=dct_get(v("schema"), "sep"))
e_set("logstore", dct_get(v("schema"), "target"))
e_drop_fields("schemas", "schema", "schema_name", "content")
e_output(name=v("logstore"), project="sls-project", logstore=v("logstore"))

最终经过数据加工处理后的数据如图,可以看到数据已经被规整化,提取出了详细的字段信息,并输出到所需的下游 logstore 中:
多模式日志数据流的实时加工与集散

总结

日志处理是一个极其繁琐的过程,究其原因是日志的边界情况特别多,而且可能随时在变。阿里云 SLS 数据加工服务是专门针对日志规整、富化、集散等处理场景。如上文所述,在多模式混杂的日志集散场景中,使用 SLS 数据加工服务可以便捷的完成需求。

上一篇:Web网站如何查看搜索引擎蜘蛛爬虫的行为


下一篇:linux中断系统那些事之----中断处理过程【转】