新功能:日志服务命令行工具ETL发布!

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 日志服务命令行工具ETL发布,解决数据采集、分析查询、投递归档、外部整合过程中的数据规整痛点,提供实时、可靠、可扩展、可管理的运行模式支持,以及全面简单的ETL规则,并支持丰富的扩展支持。

日志服务托管服务数据加工已经发布,参考: https://yq.aliyun.com/articles/704935

背景

使用日志服务,在搜索、分析时是否经常遇到以下数据格式规整的痛点?

image

1. 采集时ETL的痛点:

  • 交换机、服务器、容器、Logging模块等,通过文件、标准输出、syslog、网络等途径收集时,里面是各种日志格式的混合,只能做部分提取,例如使用logtail先提取某些基础字段,例如时间、log level、IP等,但是日志主体message中很多有价值的信息因为混合了各种日志,无法在导入时提取?
  • 单一场景下的日志,例如NGNIX,的QueryString中的字符串,或者HttpCookie、甚至HttpBody信息等,里面字段内容变化巨大,格式信息复杂度也很高,难以在提取的时候一次性使用正则表达式完成提取。
  • 某些常规日志包含了敏感信息(例如秘钥的密码,用户手机号、内部数据库连接字符串等),很难在提取时过滤掉或者做脱敏。
  • 某些JSON日志信息包含多条日志,需要分裂为多条日志进行处理等,但无法操作?
  • 其他方法例如使用SDK规则后再上传、通过Logstash channel转换后导入等方法试图解决时,事情变得复杂,数据收集的性能也变得更慢?

image

2. 查询分析时做ETL的痛点:

  • 因为日志非常复杂,SQL本身处理时,语句膨胀的比较厉害,难以修改和维护?
  • 好不容易使用SQL的正则表达式完成了某一类日志的提取,但是因为计算的动态字段没有索引,性能又受到很大影响?
  • 某些字段的关键字名都是不固定,例如KV格式、甚至待转义的KV等,使用SQL提取字段时,更加困难。
  • 对多个特定字段进行lookup富化时,Join后多个关联的复杂度和性能比较难以接受。
  • JSON日志格式的分析有一定的限制,例如:基于数组的对象内容无法很好的分析、复杂的JSON格式无法很好关联等。

3. 投递归档时做ETL的痛点:

  • 投递到OSS、MaxCompute等并不支持内容上的过滤或者格式转换?

4. 对接外部系统做ETL时的痛点:

  • 可以在其他系统(例如DataWorks、FunctionCompute)等中将日志导入进行规整后再导回日志服务,但在整个过程中因为要解决编程、配置、调试等方面的工作,相对要耗费不少功夫。

5. 花费大量时间在ETL上

以上只是部分举例,事实上,这些都是非常典型的ETL的问题。并且在业界,一种普遍的共识是大数据分析中大部分时间(有时达到80%)花费在了数据规整(Data Wangling、或者ETL)上,真正重要的分析在时间占比上反而并不高。

image

概述

我们希望提供一套简单的(稍微配置一下)、可靠(性能、稳定性、扩展性)、一站式的(不引入额外资源、概念、技术)的方案来缓解在以上日志服务场景中的主要ETL相关的痛点。

image

我们首先提供命令行工具(通过日志服务 CLI)的方式的解决方案,可以看到,通过命令行工具+简单配置文件将源日志库中日志经过处理后流出到另外一个logstore。与托管服务比起来,更加灵活、强大、可控性强,但需要您在特定Region部署运行环境。

从经济角度出发,推荐将源logstore保留1-7天,临时存储,无索引,将目标logstore作为真正分析消费的logstore。

运行场景1:实时流式处理, 自动平衡与恢复

通过依赖日志服务的消费组,完成实时流式处理,并可以自动获得负载均衡与断点恢复功能,而这些都不需要编程和额外配置:

image

运行场景2:批处理历史数据

通过相对直接的方式,并发、切分的方式,将特定时间段、分区的日志进行ETL处理:

image

使用场景1:自由编排

通过一个简单的Python风格的配置文件进行编排,一般情况下不需要写代码即可达到80%的ETL的需求和自由度:

image

提供内置的编排能力包括如下,并具备扩展能力:

  • 分派转换
  • 串联转换
  • 分裂事件
  • 保留事件
  • 丢弃事件
  • 保留字段
  • 丢弃字段
  • 自动提取KV
  • 重命名字段

这里的配置文件选择Python,而不是其他如JSON、YAML、ini、XML等方式,主要是以下几个原因:

  1. 使用通用语言例如Python,比使用一套JSON、YMAL上的DSL(Domain Specific Language)要灵活、简单、学习曲线平滑。
  2. Python本身语言特性有利于学习和扩展,Python自身对于数据结构的灵活性和处理就很强(无论是tuple、dict、list、set、字符串)还是函数式计算(map、filter、reduce、labmda等)支持都是非常自然的。这就使得其做数据处理时,代码简单易读。
  3. Python扩展性和生态比较强大,可以借力丰富的Python库做任何自由的ETL处理。默认任意的Python库都可以无缝作为ETL的插件进行使用、Python的其他生态工具都可以支持ETL的编写与调试等。
  4. 性能上使用Pypy与多进程可以较好的解决Python的GIl与性能问题。

使用场景2:使用内置转换模块

日志服务CLI ETL功能提供了完整的内置的处理模块,尤其对于正则表达式、KV、JSON、Lookup等支持灵活且完整。总体内置转换模块对常规ETL转换支持度完整,可以覆盖总体80%的转换需求:

  • 设置列值(静态/复制/UDF):各种函数计算支持
  • 正则提取列:正则的完整支持,包括动态提取字段名等
  • CSV格式提取:CSV标准的支持
  • 字典映射:直接字段映射
  • 外部CSV多列映射:从外部CSV关联对数据进行富化,支持宽匹配等。
  • 自动KV:自动提取KV,也支持自定义分隔符auto-escape场景
  • JSON自动展开:支持自动展开JSON内容,包括数组,支持展开过程的定制。
  • JSON-JMES过滤:支持基于JMES的动态选择与计算后再处理。
  • 分裂事件(基于JSON数组或字符串):基于字符串数组或JSON数组进行事件分裂
  • 多列合并(基于JSON数组或字符串):基于字符串数组或JSON数组进行多字段合并

使用场景3:扩展插件或UDF

理论上任意Python的库都可以无缝在配置文件中使用,与此同时,内置的模块也提供了更加轻量级的细微的策略或者逻辑上的UDF支持:

编排级别扩展:

  • 保留事件
  • 丢弃事件
  • 分裂事件
  • 分派转换
  • 串联转换
  • 自定义条件转换

内置函数扩展:

  • 设置列值-动态值
  • JSON自动展开格式

一个例子

这里我们举一个服务器上多钟复杂日志格式的混合通过syslog发送给日志服务后的ETL的例子:

部署安装

推荐使用pypy3来安装部署:

pypy3 -m pip insall aliyun-log-python-sdk>= 0.6.42 aliyun-log-cli

编写配置文件

可以使用任何Python适配的编辑器(例如sublime、Pycharm、VIM等),推荐自带Python插件的工具,这样可以自动高亮代码以及检查语法错误。

# 丢弃所有无关的元字段,例如__tag:...___等
DROP_FIELDS_f1 = [F_TAGS, "uselss1", "useless2"]

# 分发:根据正则表达式规则,设置__topic__的值
DISPATCH_EVENT_data = [
    ({"data": "^LTE_Information .+"}, {"__topic__": "let_info"}),
    ({"data": "^Status,.+"}, {"__topic__": "machine_status"}),
    ({"data": "^System Reboot .+"}, {"__topic__": "reboot_event"}),
    ({"data": "^Provision Firmware Download start .+"}, {"__topic__": "download"}),
    (True, {"__topic__": "default"})]       # 不匹配的默认__topic__值

# 转换:根据特定__topic__使用特定正则表达式,对字段`data`进行字段提取
TRANSFORM_EVENT_data = [
    ({"__topic__": "let_info"}, ("data", r"LTE_Information (?P<RSPR>[^,]+),(?P<SINR>[^,]+),(?P<global_cell_id>[^,]+),")),
    ({"__topic__": "machine_status"}, ("data", r"Status,(?P<cpu_usage_usr>[\d\.]+)% usr (?P<cpu_usage_sys>[\d\.]+)% sys,(?P<memory_free>\d+)(?P<memory_free_unit>[a-zA-Z]+),")),
    ({"__topic__": "reboot_event"}, ("data", r"System Reboot \[(?P<reboot_code>\d+)\]")),
    ({"__topic__": "download"}, ("data", r"Provision Firmware Download start \[(?P<firmware_version>[\w\.]+)\]"))
    ]

这里虽然是Python文件,但并没有任何编程内容,但却可以借助于Python的工具进行语法校验。

运行程序

批量运行,这里仅仅针对shard 0做一个2分钟的数据ETL做一个检验:

aliyunlog log transform_data --config=./my_etl.py --project=p1 --logstore=abc --to_project=p2 --to_logstore=xyz --to_client=account1 --client-name=account2 --shard_list=0 --from_time="2019-1-15 12:59:00+8:00" --to_time="2019-1-15 13:01:00+8:00"

验证OK后,可以直接使用持续运行,额外增加一个参数cg_name即可(表示消费组名称):

aliyunlog log transform_data --config=./my_etl.py --project=p1 --logstore=abc --to_project=p2 --to_logstore=xyz --to_client=account1 --client-name=account2 --from_time="2019-1-15 12:59:00+8:00" --cg_name="elt1"

进一步资料

相关链接

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
4月前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
34 0
|
数据采集 分布式计算 监控
网站流量日志分析—数据入库—含义和 ETL 本质解释|学习笔记
快速学习网站流量日志分析—数据入库—含义和 ETL 本质解释
416 0
网站流量日志分析—数据入库—含义和 ETL 本质解释|学习笔记
|
运维 监控 UED
阿里云EMAS远程日志发布新功能(支持移动端设备主动上报日志)
使用阿里云EMAS远程日志最新推出的主动上报日志服务,由移动端提供主动上报接口,通过代码逻辑控制是否主动上报设备日志,问题出现的同时获取设备日志,极大提升特殊场景的日志获取效率,提升问题排查体验和用户满意度。
662 0
阿里云EMAS远程日志发布新功能(支持移动端设备主动上报日志)
|
存储 Web App开发 数据采集
基于实时ETL的日志存储与分析实践
我们正处于大数据、多样化数据(非结构化)的时代,实时的机器数据快速产生,做一家数据公司的核心之一是如何充分利用好大量日志数据。本文将为大家介绍在 SLS 上兼顾日志数据灵活性、经济性的存储策略与实践。
2266 0
基于实时ETL的日志存储与分析实践
|
存储 弹性计算 监控
Serverless对日志服务中的数据进行ETL处理
通过日志服务+函数计算ETL,快速完成日志采集、加工、查询、分析和展示。
Serverless对日志服务中的数据进行ETL处理
|
SQL 监控 关系型数据库
新功能:阿里云RDS SQL执行日志 - 实时分析监控上线
阿里云关系数据库RDS(MySQL版本)的SQL执行日志已经与日志服务打通,提供实时的SQL执行分析功能,并提供内置可深钻的报表、支持自定义审计规则、异常报警、报表订阅与生态对接能力等。
7374 0
|
分布式计算 监控 Shell
新功能:日志服务IPython/Jupyter Notebook扩展发布
日志服务发布IPython/Jupyter Notebook扩展,可以轻松地使用Python对海量数据进行深度加工(ETL)、交互式分析(通过SQL、DataFrame)、机器学习与可视化等。
4093 0
|
SQL 机器学习/深度学习 监控
阿里云日志服务(SLS)SQL案例中心发布
阿里云日志服务(SLS)提供大规模日志实时查询与分析能力(LogSearch/Analytics),支持完整SQL92标准(提供restful 和 jdbc两种协议),除基本聚合功能外,支持完整的SQL计算,并支持外部数据源联合查询(Join)、机器学习、模式分析等函数。
3013 0
|
监控
日志服务(SLS)数据加工功能发布
日志服务用户,您好! 针对日志生命周期内存在的各种数据规整、分发、富化、清洗场景需求,阿里云日志服务(SLS)新推出了“数据加工”功能。 推荐在日志服务上进行数据规整、加工或联合其它数据源做分析的数据工程师使用。
7218 0

相关产品

  • 日志服务
  • 下一篇
    无影云桌面