日志服务数据加工最佳实践: 加工多层数组对象嵌套的复杂JSON

简介: 许多程序的数据结构是一个复杂的包括多层数组嵌套的对象, 本篇介绍使用日志服务数据加工处理多层数组对象嵌套的复杂JSON.


本实践案例主要是从多层数组对象嵌套的场景,向读者介绍如何使用LOG DSL解决工作中的具体需求。

需求

这里以一个复杂的包括多层数组嵌套的对象举例, 希望可以将users下的每个对象中的login_histories的每个登录信息都拆成一个登录事件.

原始日志举例

__source__:  1.2.3.4
__topic__:  
content:{
  "users": [
    {
        "name": "user1",
        "login_historis": [
          {
            "date": "2019-10-10 0:0:0",
            "login_ip": "1.1.1.1"
          },
          {
            "date": "2019-10-10 1:0:0",
            "login_ip": "1.1.1.1"
          },
          {
            ...更多登录信息...
          }
        ]
    },
    {
        "name": "user2",
        "login_historis": [
          {
            "date": "2019-10-11 0:0:0",
            "login_ip": "1.1.1.2"
          },
          {
            "date": "2019-10-11 1:0:0",
            "login_ip": "1.1.1.3"
          },
          {
            ...更多登录信息...
          }          
        ]
    },
    {
      ....更多user....
    }
  ]
}

期望分裂出的日志

__source__:  1.2.3.4
name:  user1
date:  2019-10-11 1:0:0
login_ip:  1.1.1.1
  
__source__: 1.2.3.4
name:  user1
date:  2019-10-11 0:0:0
login_ip:  1.1.1.1
  
__source__:  1.2.3.4
name:  user2
date:  2019-10-11 0:0:0
login_ip:  1.1.1.2
  
__source__: 1.2.3.4
name:  user2
date:  2019-10-11 1:0:0
login_ip:  1.1.1.3  

....更多日志....

解决方案

1、首先对content中的users做分裂和展开操作

e_split("content", jmes='users[*]', output='item')
e_json("item",depth=1)

处理后返回的日志:

__source__:  1.2.3.4
__topic__:  
content:{...如前...}
item:  {"name": "user1", "login_histories": [{"date": "2019-10-10 0:0:0", "login_ip": "1.1.1.1"}, {"date": "2019-10-10 1:0:0", "login_ip": "1.1.1.1"}]}
login_histories:  [{"date": "2019-10-10 0:0:0", "login_ip": "1.1.1.1"}, {"date": "2019-10-10 1:0:0", "login_ip": "1.1.1.1"}]
name:  user1

__source__:  1.2.3.4
__topic__:  
content:{...如前...}
item:  {"name": "user2", "login_histories": [{"date": "2019-10-11 0:0:0", "login_ip": "1.1.1.2"}, {"date": "2019-10-11 1:0:0", "login_ip": "1.1.1.3"}]}
login_histories:  [{"date": "2019-10-11 0:0:0", "login_ip": "1.1.1.2"}, {"date": "2019-10-11 1:0:0", "login_ip": "1.1.1.3"}]
name:  user2

2、然后对login_histories先做分裂在做展开操作

e_split("login_histories")
e_json("login_histories", depth=1)

处理后返回的日志:

__source__:  1.2.3.4
__topic__: 
content: {...如前...}
date:  2019-10-11 0:0:0
item:  {"name": "user2", "login_histories": [{"date": "2019-10-11 0:0:0", "login_ip": "1.1.1.2"}, {"date": "2019-10-11 1:0:0", "login_ip": "1.1.1.3"}]}
login_histories:  {"date": "2019-10-11 0:0:0", "login_ip": "1.1.1.2"}
login_ip:  1.1.1.2
name:  user2

__source__:  1.2.3.4
__topic__: 
content: {...如前...}
date:  2019-10-11 1:0:0
item:  {"name": "user2", "login_histories": [{"date": "2019-10-11 0:0:0", "login_ip": "1.1.1.2"}, {"date": "2019-10-11 1:0:0", "login_ip": "1.1.1.3"}]}
login_histories:  {"date": "2019-10-11 1:0:0", "login_ip": "1.1.1.3"}
login_ip:  1.1.1.3
name:  user2

__source__: 1.2.3.4
__topic__:  
content: {...如前...}
date:  2019-10-10 1:0:0
item:  {"name": "user1", "login_histories": [{"date": "2019-10-10 0:0:0", "login_ip": "1.1.1.1"}, {"date": "2019-10-10 1:0:0", "login_ip": "1.1.1.1"}]}
login_histories:  {"date": "2019-10-10 1:0:0", "login_ip": "1.1.1.1"}
login_ip:  1.1.1.1
name:  user1

__source__: 1.2.3.4
__topic__:  
content: {...如前...}
date:  2019-10-10 0:0:0
item:  {"name": "user1", "login_histories": [{"date": "2019-10-10 0:0:0", "login_ip": "1.1.1.1"}, {"date": "2019-10-10 1:0:0", "login_ip": "1.1.1.1"}]}
login_histories:  {"date": "2019-10-10 0:0:0", "login_ip": "1.1.1.1"}
login_ip:  1.1.1.1
name:  user1

3、经过以上两步操作,基本上得到相应的数据,只需要删除无关字段即可

e_drop_fields("content", "item", "login_histories")

处理后返回的日志:

__source__: 1.2.3.4
__topic__:
name:  user1
date:  2019-10-11 1:0:0
login_ip:  1.1.1.1
  
__source__:  1.2.3.4
__topic__:
name:  user1
date:  2019-10-11 0:0:0
login_ip:  1.1.1.1
  
__source__:  1.2.3.4
__topic__:
name:  user2
date:  2019-10-11 0:0:0
login_ip:  1.1.1.2
  
__source__: 1.2.3.4
__topic__:
name:  user2
date:  2019-10-11 1:0:0
login_ip:  1.1.1.3  

4、综上LOG DSL规则可以如以下形式:

e_split("content", jmes='users[*]', output='item')
e_json("item",depth=1)
e_split("login_histories")
e_json("login_histories", depth=1)
e_drop_fields("content", "item", "login_histories")

总结

针对以上类似的需求,首先需要进行分裂,然后在做展开操作,最后删除无关信息。

进一步参考

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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
5月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
1059 81
|
5月前
|
数据采集 运维 监控
不重启、不重写、不停机:SLS 软删除如何实现真正的“无感数据急救”?
SLS 全新推出的「软删除」功能,以接近索引查询的性能,解决了数据应急删除与脏数据治理的痛点。2 分钟掌握这一数据管理神器。
349 40
|
5月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
531 1
日志收集和Spring 微服务监控的最佳实践
|
9月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
5月前
|
负载均衡 监控 安全
5 个 IIS 日志记录最佳实践
IIS日志记录是监控Web服务器性能与安全的关键。本文介绍启用日志、应用池配置、负载均衡、敏感数据防护、日志集中管理及保留策略等五大最佳实践,助力高效分析与合规审计。
344 1
|
6月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
A+流量分析平台是阿里集团统一的全域流量数据分析平台,致力于通过埋点、采集、计算构建流量数据闭环,助力业务提升流量转化。面对万亿级日志数据带来的写入与查询挑战,平台采用Flink+Paimon+StarRocks技术方案,实现高吞吐写入与秒级查询,优化存储成本与扩展性,提升日志分析效率。
814 1
|
10月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
669 117
|
9月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
953 54
|
6月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
599 0

相关产品

  • 日志服务