Splitフィルターで分割したルートのフィールド名を削除する方法

logstashのconf(抜粋)

filter {
 json {
  source => "message"
 }
 split {
     field => "Records"
     target => "r"
     remove_field => "Records"
 }
}

inputレコード

{\"Records\": [  {    \"eventVersion\": \"1.08\",    \"userIdentity\": {      \"type\": \"AssumeRole\",      \"principalId\": \"AROAXXXXX\",      \"arn\": \"arn:aws:sts:xxx\"    },    \"eventTime\": \"2021-10-11T23:54:08Z\"  },  {    \"eventVersion\": \"1.08\",    \"userIdentity\": {      \"type\": \"AssumeRole\",      \"principalId\": \"AROAXXXXX\",      \"arn\": \"arn:aws:sts:xxx\"    },    \"eventTime\": \"2021-10-11T23:54:09Z\"  },  {    \"eventVersion\": \"1.08\",    \"userIdentity\": {      \"type\": \"AssumeRole\",      \"principalId\": \"AROAXXXXX\",      \"arn\": \"arn:aws:sts:xxx\"    },    \"eventTime\": \"2021-10-11T23:54:08Z\"  }]}"

登録結果(抜粋)

  "_source": {
    "r": {
      "eventVersion": "1.08",
      "eventTime": "2021-10-11T23:54:08Z",
      "userIdentity": {
        "principalId": "AROAXXXXX",
        "arn": "arn:aws:sts:xxx",
        "type": "AssumeRole"
      }
    }

この時、例えばフィールド名「r.eventVersion」「r.eventTime」となっているところを、「eventVersion」「eventTime」というように、ルートの「r」を削除した形でフィールド名をしていしたいです。ただし、inputファイルのフィールドのエントリーは場合により異なるため、mutateフィルターで「r.eventVersion」を「eventVersion」にリネームするといったことはせず、ルートの「r」をフィールド名から削除するという指定のやり方で行いたいです。

良い方法があればご教示頂けないでしょうか

splitでrというフィールドに下に配置されたものを、rの下ではなくて、ルート直下に置きたいということでしょうか?

そうであれば、こんな感じでLogstashの設定でruby filterを書けばできそうです。

    json {
       source => "message"
    }
    split {
       field => "Records"
       target => "r"
       remove_field => "Records"
    }

# ここから
    ruby {
    code => "
      r_kv = event.get('r')
      r_kv.each { |key,value|
        event.set(key, value)
      }

      event.remove('r')
      "
   }
# ここまで

stdoutで確認すると、rの下ではなく、ルート直下になっていることが確認できます。
image

ありがとうございます。試してみます

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.