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

简介: 本篇介绍日志服务数据加工最佳实践: 函数调用汇总, 如何绕开相关的坑等

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

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

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

如下比较区别:

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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
3671 126
|
数据采集 运维 监控
不重启、不重写、不停机:SLS 软删除如何实现真正的“无感数据急救”?
SLS 全新推出的「软删除」功能,以接近索引查询的性能,解决了数据应急删除与脏数据治理的痛点。2 分钟掌握这一数据管理神器。
977 69
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
1148 1
日志收集和Spring 微服务监控的最佳实践
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
A+流量分析平台是阿里集团统一的全域流量数据分析平台,致力于通过埋点、采集、计算构建流量数据闭环,助力业务提升流量转化。面对万亿级日志数据带来的写入与查询挑战,平台采用Flink+Paimon+StarRocks技术方案,实现高吞吐写入与秒级查询,优化存储成本与扩展性,提升日志分析效率。
1747 1
|
负载均衡 监控 安全
5 个 IIS 日志记录最佳实践
IIS日志记录是监控Web服务器性能与安全的关键。本文介绍启用日志、应用池配置、负载均衡、敏感数据防护、日志集中管理及保留策略等五大最佳实践,助力高效分析与合规审计。
659 1
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
1236 0
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
822 9
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1662 55

相关产品

  • 日志服务