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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 许多程序的数据结构是一个复杂的包括多层数组嵌套的对象, 本篇介绍使用日志服务数据加工处理多层数组对象嵌套的复杂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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Web App开发 JSON JavaScript
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
25 0
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
66 0
|
1天前
|
人工智能 数据可视化 开发工具
Git log 进阶用法(含格式化、以及数据过滤)
Git log 进阶用法(含格式化、以及数据过滤)
|
3天前
|
机器学习/深度学习 前端开发 数据挖掘
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断(下)
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
74 11
|
8天前
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断2
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
15 0
|
9天前
|
机器学习/深度学习 前端开发 数据挖掘
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
39 0
|
23天前
|
JSON C语言 数据格式
C语言与lua通过json对象交互
C语言与lua通过json对象交互
17 1
|
24天前
|
JSON 数据格式
Json字符串与QVariantList 对象相互转换
Json字符串与QVariantList 对象相互转换
7 0
|
1月前
|
存储 JSON JavaScript
Python如何解析json对象?
Python如何解析json对象?
25 1
|
2月前
|
SQL JSON Apache
Flink问题之嵌套 json 中string 数组的解析异常如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
222 1

相关产品

  • 日志服务