Ошибка Logstash с регулярным выражением конфигурации

У меня есть следующая запись в журнале:

2017-08-29 01:10:11.111 [http-noo-111-exe-1] TRACE com.javasystemsolutions.xml.gateway.Actions - The XML Gateway encountered an error. The message was Server with id OPA is not configured.

The template in use was TEST_Create_Incident_elkmonitoring.

The server in use was OPA.

The input XML was <incident>
       <summary>Test Monitoring - Summary</summary>
       <notes>Test Monitoring - Summary</notes>
       <product>ELK FAQ</product> </incident> com.javasystemsolutions.xml.gateway.ServerNotFoundException: Server with id OPA is not configured
       at com.javasystemsolutions.xml.gateway.input.PostActions.doPost(PostActions.java:215) [jss-xmlgateway.jar:?]
       at com.javasystemsolutions.xml.gateway.input.PostActions.postAction(PostActions.java:86) [jss-xmlgateway.jar:?]

Что я пытаюсь сделать, так это использовать регулярное выражение и идентифицировать текст между тегами инцидента, но, похоже, что-то не так, хотя мое регулярное выражение работает на веб-сайте regex101, а configtest возвращает конфигурацию OK. Моя конфигурация приведена ниже, кто-нибудь знает, что не так?

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
    file {
        type => "logs"
        path => "C:/logs/*.log"
        add_field => [ "Application", "ELK_GW_Test" ]
        add_field => [ "secret", "1234" ]
        start_position => beginning

        codec => multiline {
            pattern => "(^%{TIMESTAMP_ISO8601})"
            #negate => true
            what => "previous"
        }
    }
}
filter {
    #multiline {
      #pattern => "(^%{TIMESTAMP_ISO8601})"
      #negate => true
      #what => "previous"
    #}
    #if "_grokparsefailure" in [tags] {
      #drop { }
    #}
    if [host] == "host1" {
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE} %{LOGLEVEL:Severity} %{GREEDYDATA:log_message}"}
        }
        grok {
        match => {"message" => "<incident>(?<incident>[\s\S]*)</incident>"}
    }
    }
}
output {
    tcp {
        host => "host1.com"
        port => 1234
        codec => "json_lines"
    }
    #if  "The message was Server with id " in [log_message]  {
    #email {
            #from => "[email protected]"
            #subject => "Central logstash alert"
            #to => "[email protected]"
            #via => "smtp"
            #body => "The incident details are: %{incident} \nLog file: %{path}"
            #options => {
                #starttls => "true"
                #smtpIporHost => "email.XYZ.com"
                #port => "587"
                #userName => "[email protected]" 
                # email-server-mail-id
                # password => "password"
                #authenticationType => "LOGIN"
            #}
        #}
    #}
}

person Fotis E.    schedule 06.09.2017    source источник


Ответы (1)


Эта часть конфигурации неверна:

    grok {
        match => ["requested_incident", "(?s)<incident>.+?</incident>"]
    }

Попробуйте это вместо этого:

    grok {
        match => {"message" => "<incident>(?<incident>[\s\S]*)</incident>"}
    }

Я использовал собственный шаблон, который будет искать в поле сообщения. То, что найдено, попадет в поле, называемое инцидентом.

person baudsp    schedule 06.09.2017
comment
спасибо за вашу помощь, как сейчас кажется, в моем конфиге нет проблем, но по неизвестной причине ничего не анализируется в моем индексе - person Fotis E.; 07.09.2017
comment
Проблема в вашем конфиге в том, что поля requested_incident не существует, поэтому при попытке сопоставить это поле с вашим шаблоном ничего не происходит. Кроме того, указанный шаблон ((?s)<incident>.+?</incident>) не создает новое поле с захваченным значением. Вот почему я использовал пользовательский шаблон в моем ответе. - person baudsp; 07.09.2017
comment
Ваша конфигурация действительна, так как logstash будет запускать и обрабатывать события, но она неверна, поскольку не делает того, что вы намеревались. - person baudsp; 07.09.2017
comment
Я добавил полную конфигурацию выше (пожалуйста, игнорируйте часть оповещения по электронной почте, так как я еще не работал над ней). Итак, как видите, я добавил ваше регулярное выражение и не получил никаких ошибок во время --configtest, но данные не анализируются в моем индексе. - person Fotis E.; 07.09.2017
comment
Я добавил многострочный кодек в раздел ввода, потому что получаю следующее сообщение об ошибке. По умолчанию рабочие потоки конвейера равны 1, потому что есть некоторые фильтры, которые могут не работать с несколькими рабочими потоками. - person Fotis E.; 07.09.2017
comment
Спасибо. Судя по вашей конфигурации, может быть две проблемы: а) если [host] == "host1" не соответствует истине, журналы не будут обрабатываться фильтром grok. б) плагин ввода файлов читает каждый файл только один раз, поэтому, если файлы не изменились, вам нужно заставить logstash повторно анализировать файлы - person baudsp; 07.09.2017
comment
Кроме того, я считаю полезным использовать вывод stdout { codec => json }, чтобы избежать проверки в elasticsearch при отладке конфигурации. - person baudsp; 07.09.2017
comment
Судя по всему, на нашем сервере tomcat отсутствуют некоторые хнадлеры, поэтому парсинг не работает. Я получаю следующую ошибку: Не удается загрузить обработчик журнала 1catalina.org.apache.juli.FileHandler java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler - person Fotis E.; 08.09.2017
comment
Я не понимаю ваш последний комментарий и то, как он связан с вашей конфигурацией logstash. Если проблема не в logstash, вам придется создать еще один вопрос. - person baudsp; 08.09.2017
comment
вы правы, это не связано, я просто поделился с вами, почему я не мог запустить свой конфиг. В любом случае и для дальнейшего использования я исправил это, используя последнюю версию logstash. В очередной раз благодарим за помощь! :) - person Fotis E.; 08.09.2017