Разбор вложенных журналов JSON с помощью фильтра мутаций и фильтра JSON

У меня есть несколько вложенных журналов, составленных с помощью json, и я хочу проанализировать с помощью фильтра мутаций в ELK для анализа журналов и матриц в Кибане.

Sample of Log like this:
{
"msgs": [{
    "ts": "4734206Z",
    "tid": 4,
    "eid": 1,
    "lvl": "Information",
    "cat": "xxx",
    "msg": {"cn"}
},
{
    "ts": "2017",
    "tid": 4,
    "lvl": "Information",
    "cat": "xxxx",
    "msg": {
        "cnt": "REQ"
    },
    "data": {
        "Headers": {
            "Connection": "Keep-Alive",
            "Content-Length": "685",
            "Content-Type": "text/xml; charset=utf-8",
            "Accept-Encoding": "gzip, deflate",
            "Expect": "100-continue",
            "Host": "localhost:1000",
            "SOAPAction":\"http://xxx.xxx.com/xxSer/SendXXXX\""
        }
    }
},
{
    "ts": "2017-08-22T10:30:07.8074746Z",
    "tid": 4,
    "lvl": "Information",
    "cat": "xxx",
    "msg": {
        "cnt": "xxx addded."
    },
    "data": {
        "SourceType": "xxx",
        "Version": "1.0",
        "DestinationTypes": ["xxxxx"],
        "ConfigurationFile": "./xxx/xxx.xml"
    }
},
{
    "ts": "2017-08-22T10:30:07.8264749Z",
    "tid": 4,
    "lvl": "Information",
    "cat": "xxx",
    "msg": {
        "cnt": "REQ"
    },
    "data": {
        "Trace": "xxx"      }
    }
]
}

Здесь вы можете видеть, что вложенные сообщения json содержат массив элементов для полей. Теперь проблема в том, что порядок вложенного массива элементов не фиксирован. Из-за этого мы не можем отобразить или получить поле, используя фильтр мутаций.

else if[type]=="XXXXX"
        {
                json {
                    source => "message"
                    target => "doc"
                    }
                mutate {
                    add_field => {
                                "ts"  => "%{[doc][msgs][0][ts]}"
                                "tid1" => "%{[doc][msgs][0][tid]}"
                                "eid1" => "%{[doc][msgs][0][eid]}"
                                "lvl1" => "%{[doc][msgs][0][lvl]}"  
                                "cat1" => "%{[doc][msgs][0][cat]}"
                                "msg1" => "%{[doc][msgs][0][msg]}"
                                "data" => "%{[doc][msgs][1][data]}"
                                "actual-message" =>"%{[doc][msgs][3][data][Trace]}"
                                "error" =>"%{[doc][msgs][6][msg][ex]}"
                                "error-code" =>"%{[doc][msgs][6][msg][ex][exs][0][ec]}"
                                }
            }
        }

По приведенному выше сценарию мы пытаемся получить поля элементов массива [0] и [6]. Но иногда одни и те же поля появляются в [7] или [9] или [10].

Пожалуйста, предоставьте решение для этого, чтобы динамически мы могли получить нужные поля, не зависящие от фиксированного порядка элементов массива.

0 ответов

Другие вопросы по тегам