日志服务数据加工最佳实践: 函数调用

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 本篇介绍日志服务数据加工最佳实践: 函数调用汇总, 如何绕开相关的坑等

编写数据加工规则过程中,需根据场景选择不同的函数。LOG DSL函数的具体用法可参考数据加工语法参考

场景1: 理解e_keep/KEEP的应用场景

默认规则中, 不做处理的事件都是保留. 所以KEEP通常只用于特定场景. 如果需要丢弃日志, 可以使用e_drop/e_drop传入条件或者使用e_if/e_if_elseDROP搭配使用:

如下比较区别:

e_keep(e_search(...) )    # 满足保留, 不满足丢弃
e_drop(e_search(...) )    # 满足丢弃, 不满足保留
e_if(e_search("..."), KEEP)    # 没有意义的代码, 满足后KEEP
e_if_else(e_search("..."), KEEP, DROP)    # 有意义
e_if(e_search("not ..."), DROP)        # 有意义

场景2:尽可能使用函数自身提供的功能

子场景1:当原字段不存在或者为空时,为字段赋值

  • 最佳实践
e_set("result", ".....value...", mode="fill")
  • 非最佳实践
e_if(op_not(v("result")), e_set("result", ".....value..."))
  • 字段的提取与覆盖模式,参考字段提取与覆盖模式
    提取与覆盖模式包含:

    • fill – 当原字段不存在或者值为空时
    • add –当原字段不存在时设置
    • overwrite – 总是设置
    • fill/add/overwrite-auto – 当新值非空时才fill/add/overwrite

子场景2:使用GROK函数简化正则表达式

  • 加工逻辑
    提取content字段中的IP地址


  • 原日志格式
content:"ip address: 192.168.1.1"
  • 提取目标: 192.168.1.1

  • 最佳实践
e_regex("content", grok(r"\w+: (%{IP})"), "addr")
# 或者
e_regex("content", grok(r"\w+: (%{IP:addr})"))
  • 非最佳实践
    如下代码相对复杂一些:
e_regex("content", grok(r"\w+: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"), "addr")

进一步参考Grok函数说明

子场景3:给多个字段赋值

  • 最佳实践
e_set("k1", "v1", "k2", "v2", "k3", "v3", ....)
  • 相对冗余的规则
e_set("k1", "v1")
e_set("k2", "v2")
e_set("k3", "v3")
...

场景3:使用e_compose减少重复判断

  • 加工逻辑
    如果content是123,则首先执行删除age和name字段,然后重命名content为ctx


  • 原日志格式
content:123
age:23
name:twiss
  • 加工后的日志格式
  ctx: 123
  • 最佳实践
    一般情况下推荐使用e_compose组合相同逻辑下的操作.
e_if(e_search("content==123"), 
     e_compose(e_drop_fields("age|name"), e_rename("content", "ctx")))
  • 非最佳实践
    如下代码会多次判断, 一定程度上效率低一些.
e_if(e_search("content==123"), e_drop_fields("age|name"))
e_if(e_search("content==123"), e_rename("content", "ctx"))

进一步参考事件判断

场景4:注意表达式函数的参数类型

日志事件的字段和值在函数之间传递的过程中,始终都是字符串形式。非字符串类型的数据会被自动转化为字符串类型。因此在调用函数时,要注意各个函数能接收的参数类型。具体每个函数接收的参数类型可参考数据加工语法参考中对各个函数的解释。

样例1:
op_add既可以接收字符串类型,也可以接受数值类型,因此不需要做参数类型转换

e_set("a", 1)
e_set("b", 2)

op_add(v("a"), v("b"))    # 合法,返回值为"12"
op_add(ct_int(v("a")), ct_int(v("b")))    # 合法, 返回值为3

样例2:
op_sum, op_mul等函数只能接受数值类型,因此需要做数据类型转换,将字符串转化为数值型

e_set("a", 1)
e_set("b", 2)

op_sum(v("a"), v("b"))    # 非法
op_sum(ct_int(v("a")), ct_int(v("b")))    # 合法, 返回值为3

op_mul(v("a"), v("b"))    # 非法
op_mul(ct_int(v("a")), ct_int(v("b")))    # 合法, 返回值为2

日志事件在函数间传递,字段值都被自动转化为字符串类型,因此v("a"), v("b")都是字符串类型。而op_sum, op_mul等函数只能接受数值类型,可通过ct_int将字符串转化为整型,再传递给这类函数。

样例3:

"""
加工逻辑: 将time1表示的日期时间转化为Unix时间戳
"""
e_set("time1", "2019-06-03 2:41:26")

e_set("time2", dt_totimestap(v("time1"))) # 非法

e_set("time2", dt_totimestap(dt_parse(v("time1")))) # 合法
e_set("time2", dt_parsetimestamp(v("time1"))) # 合法
  • dt_totimestap接收的参数类型为日期时间对象, 不是字符串。因此需要调用dt_parse将time1的字符串值类型转化为日期时间对象类型。
  • 也可直接使用dt_parsetimestamp函数,它既可接收日期时间对象,也可接收字符串。

场景5:注意表达式函数的异常处理情况

许多表达式函数对于输入的参数有一定的要求, 如果不满足会报错. 也有一些会返回默认值容错, 需要特别注意, 这些默认值传递给后续的函数时可能进一步会报错. 例如:

e_set("data_len": op_len(v("data")))                     # 错误调用
e_set("data_len": op_len(v("data", default="")))  # 正确调用

如果字段data不存在时v("data")会返回None, 那么第一个调用会报错. 第二个通过默认值default给与一个合法的默认值, 让表达式可以不会报错.

场景6:理解e_if与e_switch的区别

  • e_if语法
e_if(条件1, 操作1, 条件2, 操作2, 条件3, 操作3, ....)

条件与操作的配对组合, 依次根据条件判断, 满足条件的进行相应操作, 不满足条件的不进行对应操作, 进行下一个条件判断.

  • e_switch语法
e_switch(条件1, 操作1, 条件2, 操作2, 条件3, 操作3, ...., default=None)

条件与操作的配对组合, 依次根据条件判断, 满足条件的进行相应操作, 然后直接返回操作的结果, 不满足条件的不进行对应操作, 进行下一个条件判断. 如果没有任何条件满足, 并且配置了default参数的话, 执行default配置的操作并返回

  • 样例

原始日志

status1: 200
status2: 404

e_if加工规则

e_if(e_match("status1", "200"), e_set("status1_info", "normal"), 
          e_match("status2", "404"), e_set("status2_info", "error"))

加工后日志

status1: 200
status2: 404
status1_info: normal
status2_info: error

e_if会进行所有条件的判断,满足的则进行对应操作,不满足不进行对应操作。


e_switch加工规则

e_switch(e_match("status1", "200"), e_set("status1_info", "normal"), 
                   e_match("status2", "404"), e_set("status2_info", "error"))

加工后日志

status1: 200
status2: 404
status1_info: normal

e_switch只要有一个条件满足,就会返回结果,不会再进行后续条件判断。

进一步参考

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

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

相关产品

  • 日志服务