Grok filter - проверить наличие поля - PullRequest
0 голосов
/ 16 мая 2018

У меня есть лог-сообщение с такой структурой:

"message" => "{

"@timestamp":"201856T12:54:33.347+02:00",
"thread":"main",
"logger_name":"org.elasticsearch.bootstrap",
"level":"WARN",
"message":"JNA not found. native methods will be disabled.",
"stack_trace": "java.lang.ClassNotFoundException: ... 
}

Как видите, внутри сообщения есть поле stack_trace, но элемент управления

if [message][stack_trace] {
    mutate { add_tag => ["EXCEPTION"] }
}

не работает

Как я могу проверить, содержит ли "message" поле "stack_trace"?

Другие данные: сообщение генерируется через logstash-logback-encoder следующим образом:

    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>localhost:5000</destination>

        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>Europe/Berlin</timeZone>
                </timestamp>
                <callerData>
                    <classFieldName>classname</classFieldName>
                    <methodFieldName>method</methodFieldName>
                    <fileFieldName>file</fileFieldName>
                    <lineFieldName>line</lineFieldName>
                </callerData>
                <threadName>
                    <fieldName>thread</fieldName>
                </threadName>
                <loggerName />
                <logLevel />
                <message />
                <stackTrace />
            </providers>
        </encoder>
   </appender>

Это содержимое входного конвейера logstash:

input {
    tcp {
        port => 5000
    }
}

filter {
    grok {
        match => { "message" => "LAT: %{NUMBER:LAT:float}, LON: %{NUMBER:LON:float}"}

        match => { "message" => "file %{WORD:TIPOFILE} elaborato" }

        match => { "message" => "Pubblicazione file %{WORD:PUB_FILENAME} sulla coda %{WORD:DEST_QUEUE} terminata" }
    }

    mutate {
        rename => { "TIPOFILE" => "[filename]" }
        rename => { "LAT" => "[location][latitude]" }
        rename => { "LON" => "[location][longitude]" }
        rename => { "DEST_QUEUE" => "[destQueue]" }
        rename => { "PUB_FILENAME" => "[nomeFilePubbl]" }
    }
}

output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => "elasticsearch:9200"
    }
}
...