日志服务数据加工最佳实践: 使用搜索映射做高级数据富化

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: 典型映射方式不能满足富化需求时, 可以使用搜索映射, 搜索映射与传统方式映射的区别在于匹配方式不同. 本篇介绍日志服务数据加工最佳实践: 使用搜索映射做高级数据富化.

普通映射 vs 搜索映射

典型映射方式不能满足富化需求时, 可以使用搜索映射, 搜索映射与传统方式映射的区别在于匹配方式不同.

普通映射方式

一般映射使用文本完全匹配方式来映射, 例如NGNIX日志中, 需要将状态码转换为一个文本表示:

状态码 文本
200 成功
300 跳转
400 请求错误
500 服务器错误

下面规则调用e_dict_map将字段status中的http请求状态码转化为文本描述, 放入字段status_desc.

e_dict_map({"400": "请求错误", "500": "服务器错误", "300": "跳转", "200": "成功"}, "status", "status_desc")

实际上, NGNIX的HTTP请求的状态是不止上述4种, 当status值是401, 404时, 需要更新字典覆盖, 否则会匹配不上. 参考Http请求状态码

搜索映射方式

当需要一些灵活的针对特定值做匹配逻辑时的映射, 例如:

状态码 文本
1XX-2XX 成功
3XX 跳转
4XX 请求错误
5XX 服务器错误

就需要使用搜索映射来实现, 这里的字典的关键字实际是一个搜索查询字符串.

状态码 文本
status<=299 成功
status: [300, 399] 跳转
status: [400, 499] 请求错误
status: [500, 599] 服务器错误

使用如下代码:

e_search_dict_map({"status: [400, 499]": "请求错误", "status: [500, 599]": "服务器错误", "status: [300, 399]": "跳转", "status<=200": "成功"}, "status", "status_desc")

场景样例1:使用搜索映射字典做复杂富化

这里以网络请求日志来距离做一个更复杂逻辑的映射:

需求

原始日志

"日志1"
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822

加工需求

根据日志事件的http_statusbody_bytes_sent的值的不同,为每个事件添加不同的type信息。

  • http_status2XX并且body_bytes_sent长度小于1000的日志事件设置type正常
  • http_status2XX并且body_bytes_sent长度大于等于1000的日志事件设置type过长警告
  • http_status3XX的日志事件设置type重定向
  • http_status4XX的日志事件设置type错误
  • 其他的日志事件设置type其他

LOG DSL编排

e_search_dict_map({'http_status~="2\d+" and body_bytes_sent < 1000': "正常", 'http_status~="2\d+" and body_bytes_sent >= 1000': "过长警告", 'http_status~="3\d+"': "重定向", 'http_status~="4\d+"': "错误",  "*": "其他"}, "http_status", "type")

加工后的日志

"日志1"
type: 正常
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
type: 过长警告
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
type: 错误
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
type: 其他
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822

说明

  • 上面使用了函数e_search_dict_map,具体语法参照e_search_dict_map函数. 其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。
  • 和基于表格来进行数据富化一样,基于字典的富化,除了可以使用通过{}直接构建的字典之外,也可以基于任务配置资源、外部OSS资源、表格资源等来构建字典,具体可参考字典构建

场景样例2:使用搜索表格做数据富化

原始日志

"日志1"
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822

需求

针对数据中的http_status, body_bytes_sent等字段, 映射出其他多个字段例如type, warning_levelwarning_email等. 具体的规则样例存储于RDS-MySQL中, 例如:

MYSQL 数据库表中数据

content type warning_level warning_email
http_status~="2d+" and body_bytes_sent < 1000 正常 INFO normal@etl.com
http_status~="2d+" and body_bytes_sent >= 1000 过长警告 WARNING over-long@etl.com
http_status~="3d+" 重定向 WARNING redirect@etl.com
http_status~="4d+" 错误 ERROR error@etl.com

LOG DSL编排

e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", "warning_email"])

使用了e_search_table_map 语法,详细请参照e_search_table_map搜索表格语法,此处简单讲解,res_rds_mysql()里面填入的是去 RDS MYSQl 拉取数据的配置,该函数会拉取指定的mysql表格,具体语法请见res_rds_mysql函数用法,"content"字段指定的是mysql表中的字段,会使用该字段的值的内容去匹配原始日志中的内容,具体匹配规则请见e_search用法,可支持正则,完全匹配,模糊匹配等形式。

加工后日志

根据日志事件的http_statusbody_bytes_sent的值的不同,为每个事件添加不同的type, warning_level以及warning_email信息。

"日志1"
type: 正常
warning_level: INFO
warning_email: normal@etl.com
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
type: 过长警告
warning_level: WARNING
warning_email: over-long@etl.com
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
type: 错误
warning_level: ERROR
warning_email: error@etl.com
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
type: 其他
warning_level: INFO
warning_email: others@etl.com
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822
  • 以上加工规则默认匹配到表中一行之后,立即返回。可以为e_search_table_map设置参数 multi_match=True和multi_join=",",分别表示开启多行匹配和匹配到多个值时候,多值使用逗号进行组合。
e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", "warning_email"], multi_match=True,multi_join=",")
  • 以上加工规则默认使用表格中的列名作为添加的字段名称,也可以修改为新的字段名称。例如warning_email字段重命名为email字段,把新字段和原字段写在一个原组里面即可,如下示例
e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", ("warning_email", "email")],multi_match=True,multi_join=",")

说明

  • 上面使用了函数e_search_table_map,具体语法参照e_search_table_map函数. 其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。
  • 基于表格的富化,构建表格方式除了RDS-MySQl外, 还有其他方法, 例如动态构建, 本地资源, OSS等, 具体可参考表格构建

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
image

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
23天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
46 1
|
7天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
34 2
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
45 2
|
2月前
|
开发者 Python
基于Python的日志管理与最佳实践
日志是开发和调试过程中的重要工具,然而,如何高效地管理和利用日志常常被忽略。本文通过Python中的logging模块,探讨如何使用日志来进行调试、分析与问题排查,并提出了一些实际应用中的优化建议和最佳实践。
|
2月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
191 3
|
3月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
50 0
|
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

相关产品

  • 日志服务