如何用Logstash解析JSON数组为JSON对象并发送至Loki可视化
解决Logstash拆分JSON数组为单个对象适配Loki的方案
问题分析
当前Logstash配置仅将整个JSON数组解析到message字段,未把数组拆分为独立的用户对象事件,导致无法被Loki转换为表格或时序数据。需通过split过滤器拆分数组,并调整字段结构适配Loki需求。
调整后的Logstash过滤器配置
filter { # 将原始JSON数组解析到user_data字段,避免干扰根字段 json { source => "message" target => "user_data" } # 拆分user_data数组,每个元素生成独立事件 split { field => "user_data" } # 提取嵌套字段到根级别,重命名为友好名称,添加固定字段 mutate { add_field => { "id" => "%{[user_data][id]}" "user_name" => "%{[user_data][user_name__v]}" "data_type" => "%{[user_data][data_type__v]}" "token_id" => "%{[user_data][token_id__v]}" "last_login" => "%{[user_data][last_login__v]}" "active" => "%{[user_data][active__v]}" "profile_type" => "%{[user_data][profile_type__v]}" "app" => "TestingApp" "job" => "cronData" } # 清理中间字段和不需要的字段 remove_field => [ "user_data", "event", "message" ] } # 将last_login转换为Logstash标准时间字段,适配Loki时序数据需求 date { match => [ "last_login", "ISO8601" ] target => "@timestamp" } }
配置说明
- JSON解析:把原始输入的JSON数组解析到
user_data字段,避免直接覆盖根字段或原始message。 - 数组拆分:
split过滤器会遍历user_data数组,将每个元素生成为一个独立的Logstash事件,每个事件对应一个用户对象。 - 字段映射:将嵌套在
user_data中的字段提取到根级别,并将带后缀__v的字段重命名为更简洁的名称(比如user_name__v→user_name),同时保留你需要的固定字段app和job。 - 时间处理:通过
date过滤器把last_login转换为Logstash的@timestamp字段,这是Loki识别时序数据的标准时间字段。
处理后输出格式示例
每个用户对象会成为独立的事件,结构如下:
{ "@timestamp": "2023-10-18T09:19:41.000Z", "id": "23232", "user_name": "bacd@gmail.com", "data_type": "full__v", "token_id": "43434", "last_login": "2023-10-18T09:19:41.000Z", "active": "true", "profile_type": "us_document_bulk_action_users_with_creat__c", "app": "TestingApp", "job": "cronData" }
这种扁平化的结构可以直接被Loki的基础转换功能识别,用来生成表格数据或构建时序视图。
内容的提问来源于stack exchange,提问作者Manvinder Singh
相关产品推荐
相关产品推荐

