首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在json输出中重命名子键

在json输出中重命名子键
EN

Stack Overflow用户
提问于 2022-02-15 15:41:13
回答 1查看 190关注 0票数 0

是否可以在JSON中重命名子项或添加新的子键?

例如,我有这个日志输出:

代码语言:javascript
复制
{
    "kubernetes": {
        "pod_name": "kube-apiserver-tst",
        "namespace_name": "kube-system",
        "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
        "labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
}

我知道,使用record_transformer,我可以添加一个新键:

代码语言:javascript
复制
<record>
  pod_labels "something ..."
</record>

但是,它似乎只能在JSON的根处创建一个新键:

代码语言:javascript
复制
{
    "kubernetes": {
        "pod_name": "kube-apiserver-tst",
        "namespace_name": "kube-system",
        "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
        "labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
    "pod_labels": "something ..."
}

但我能让它看起来像这样吗?

代码语言:javascript
复制
{
    "kubernetes": {
        "pod_name": "kube-apiserver-tst",
        "namespace_name": "kube-system",
        "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
        "labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
        "pod_labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
}

或者这个:

代码语言:javascript
复制
{
    "kubernetes": {
        "pod_name": "kube-apiserver-tst",
        "namespace_name": "kube-system",
        "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
        "pod_labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-16 18:16:41

JSON无效。一个关闭的卷发支架不见了。

下面是有效的JSON:

代码语言:javascript
复制
{
    "kubernetes": {
        "pod_name": "kube-apiserver-tst",
        "namespace_name": "kube-system",
        "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
        "labels": {
            "component": "kube-apiserver",
            "tier": "control-plane"
        }
    }
}

最小化JSON (echo '{JSON}' | jq -c .):

代码语言:javascript
复制
{"kubernetes":{"pod_name":"kube-apiserver-tst","namespace_name":"kube-system","pod_id":"93a2b43a-46e6-4539-8674-06dede2619fa","labels":{"component":"kube-apiserver","tier":"control-plane"}}}

变压器过滤器插件可以与Ruby一起使用(通过红宝石选项)来操作现有的键,然后可以使用它的关键字选项删除不想要的键。

下面是示例配置:

代码语言:javascript
复制
<filter debug.test>
  @type         record_transformer
  enable_ruby   true
  <record>
    temp        ${ l = record["kubernetes"]["labels"]; record["kubernetes"]["pod_labels"] = l; nil; }
  </record>
  remove_keys   temp, $.kubernetes.labels
</filter>

以下是完整的测试:

fluent.conf

代码语言:javascript
复制
<source>
  @type       forward
</source>

<filter debug.test>
  @type         record_transformer
  enable_ruby   true
  <record>
    temp        ${ l = record["kubernetes"]["labels"]; record["kubernetes"]["pod_labels"] = l; nil; }
  </record>
  remove_keys   temp, $.kubernetes.labels
</filter>

<match debug.test>
  @type       stdout
</match>

使用此配置启动fluentd

代码语言:javascript
复制
fluentd -c fluent.conf

在另一个终端上,用fluent-cat (echo '{JSON}' | fluent-cat debug.test)发送一个事件:

代码语言:javascript
复制
echo '{"kubernetes":{"pod_name":"kube-apiserver-tst","namespace_name":"kube-system","pod_id":"93a2b43a-46e6-4539-8674-06dede2619fa","labels":{"component":"kube-apiserver","tier":"control-plane"}}}' | fluent-cat debug.test

fluentd日志中,您应该看到所需的输出:

代码语言:javascript
复制
2022-02-16 23:08:25.919967225 +0500 debug.test: {"kubernetes":{"pod_name":"kube-apiserver-tst","namespace_name":"kube-system","pod_id":"93a2b43a-46e6-4539-8674-06dede2619fa","pod_labels":{"component":"kube-apiserver","tier":"control-plane"}}}

使用jq (echo '{JSON}' | jq .)格式化输出:

代码语言:javascript
复制
echo '{"kubernetes":{"pod_name":"kube-apiserver-tst","namespace_name":"kube-system","pod_id":"93a2b43a-46e6-4539-8674-06dede2619fa","pod_labels":{"component":"kube-apiserver","tier":"control-plane"}}}' | jq .

输出:

代码语言:javascript
复制
{
  "kubernetes": {
    "pod_name": "kube-apiserver-tst",
    "namespace_name": "kube-system",
    "pod_id": "93a2b43a-46e6-4539-8674-06dede2619fa",
    "pod_labels": {
      "component": "kube-apiserver",
      "tier": "control-plane"
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71129267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档