SLS 基于维表的映射关系,将日志转发到不同的logstore

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 通过简单场景介绍日志服务-数据加工通过oss维表映射去实现将日志转发到不同的logstore

背景介绍

什么是日志服务?

日志服务是针对日志类数据的一站式服,像Log、Metric这类数据我们可以提供大规模、低成本、实时的平台化服务。它的应用场景非常多,像一些监控、分析、诊断都可以通过日志服务去实现,无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力

什么是数据加工?

数据加工是日志服务推出的一项功能,是面向日志进行实时的处理,实时性高且功能丰富。数据加工目前提供了两百多种DSL算子用作数据处理,我们可以在数据加工中根据需求做数据过滤、转换、复制、富化、分裂等操作。


场景介绍

  • 在我们使用数据加工时,若需要根据某种规则将日志分发到不同的logstore中,实现方式有以下两种:
  • 通过将转发规则写入到DSL中去实现
  • 维护一张维表,根据映射关系来实现(推荐)
  • 在此文章中将主要介绍基于维表的映射关系来实现日志分发至不同的logstore,比如我们要通过日志中不同的code值,将日志分发至维表所对应的logstore中,如下图所示

场景示例

根据日志中code值和维表映射将日志分发至不同的logstore

  • 准备一张维表,在这个示例中我们将拉取oss的csv文件
  • csv格式:

code,logstore

2xx,logstore_2xx

3xx,logstore_3xx

4xx,logstore_4xx

5xx,logstore_5xx

  • 原始日志:

host:www.xxx.mock.com

http_referer:www.xxx.mock.com

remote_user:2hdtk

request_method:GET

request_uri:/request/path-3/file-5

code:200



host:www.xxx.mock.com

http_referer:www.xxx.mock.com

remote_user:2hdtk

request_method:GET

request_uri:/request/path-3/file-5

code:301


host:www.xxx.mock.com

http_referer:www.xxx.mock.com

remote_user:2hdtk

request_method:GET

request_uri:/request/path-3/file-5

code:403



host:www.xxx.mock.com

http_referer:www.xxx.mock.com

remote_user:2hdtk

request_method:Get

request_uri:/request/path-3/file-5

code:500

  • 加工目标:
  • 将code值为2xx的日志分发到logstore_2xx中
  • 将code值为3xx的日志分发到logstore_3xx中
  • 将code值为4xx的日志分发到logstore_4xx中
  • 将code值为5xx的日志分发到logstore_5xx中
  • 实现DSL(基于维表映射):

#创建一个临时字段code_map 去和维表做映射 code:200->code_map:2xx  

e_set("code_map", str_join("",op_slice(v("code"),1), "xx"))

#通过res_oss_file拉取csv文本,tav_parse_csv将文本转换为维表,再通过e_table_map映射富化出目标logstore

#res_oss_file设置change_detect_interval,更新时会自动拉取,拉取间隔单位为s

e_table_map(

   tab_parse_csv(

       res_oss_file(

           "oss-cn-hangzhou.aliyuncs.com",

           "ak_id",

           "ak_key",

           "log-etl-staging",

           "code.csv",

           format="text",change_detect_interval=1000)),[("code_map","code")],"logstore")

#删除临时字段

e_drop_fields("code_map")

#输出日志

e_output(project="etl-test-zhy", logstore=v("logstore"))



为什么推荐使用维表映射而不是DSL内编写转发规则?

  • 基于DSL编写转发规则的实现:

#通过e_match正则匹配code值,分发至不同的logstore

e_switch(e_match("code", "2\d+"), e_output(project="etl-test-zhy", logstore="logstore_2xx"),

        e_match("code", "3\d+"), e_output(project="etl-test-zhy", logstore="logstore_3xx"),

        e_match("code", "4\d+"), e_output(project="etl-test-zhy", logstore="logstore_4xx"),

        e_match("code", "5\d+"), e_output(project="etl-test-zhy", logstore="logstore_5xx"))

  • 两种方案对比:



操作步骤

  • 选择需要加工的logstore, 进入数据加工页面



  • 编写DSL,在正确填写res_oss_file函数相关配置后可以通过高级预览查看加工结果




  • 预览加工结果





  • 保存加工任务,此处可以配置存储目标和加工范围等信息。

注:我们已经在e_output()函数中配置了输出的project和logstore,此处不需要再配置存储目标,但如果日志中存在无法匹配的日志,需要配置默认存储目标。如果配置的目标Project、Logstore不存在,您可以在此页面中将高级参数配置中的key设置为config.sls_output.failure_strategyvalue设置为{"drop_when_not_exists":"true"} 来跳过该日志,被跳过的日志会被丢弃,并且上报为warning级别的日志。如果不设置高级参数配置,数据加工任务将一直等待目标Project、Logstore被创建后再执行加工任务


如何将同一条日志分发到多个logstore中?

  • 我们可以这样维护一张维表,通过"#"来分割多个logstore

通过"#"来分割多个logstore

code,logstore

2xx,logstore_2xx#logstore_2#logstore_3

3xx,logstore_3xx#logstore_3

4xx,logstore_4xx#logstore_4#logstore5

5xx,logstore_5xx#logstore_5

  • 实现DSL:

这里由于目标logstore数量不固定,所以我们用到e_split通过"#"来分裂日志,同一条日志被分裂的个数由logstore的数量决定。

#创建一个临时字段code_map 去和维表做映射 code:200->code_map:2xx  

e_set("code_map", str_join("",op_slice(v("code"),1), "xx"))

#通过res_oss_file拉取csv文本,tav_parse_csv将文本转换为维表,再通过e_table_map映射富化出目标logstore

e_table_map(

   tab_parse_csv(

       res_oss_file(

           "oss-cn-hangzhou.aliyuncs.com",

           "ak_id",

           "ak_key",

           "log-etl-staging",

           "code.csv",

           format="text",change_detect_interval=1000)),[("code_map","code")],"logstore")

#删除临时字段

e_drop_fields("code_map")

#根据logstore分裂事件

e_split("logstore", sep='#')

#输出日志

e_output(project="etl-test-zhy", logstore=v("logstore"))

相关函数文档链接

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
11天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
117 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
216 3
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
131 3
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1625 14
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
30 0
|
1月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
193 0
|
1月前
|
存储 分布式计算 NoSQL
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
40 0
|
1月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
54 0
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
2月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
150 9