Как заставить Logstash Grok Fliter видеть новую строку и возврат каретки?

Я пытаюсь проанализировать наши файлы журналов и отправить их в elasticsearch. Проблема в том, что наш клиент S3 вставляет в файл строки, содержащие символы возврата каретки (\ r) вместо символов новой строки (\ n). Конфигурация для входного фильтра файлов с использованием '\ n' в качестве разделителя, что соответствует 99% данных. Когда я запускаю logstash для этих данных, он пропускает последнюю строку, которую я действительно ищу. Это связано с тем, что фильтр ввода файлов обрабатывает символы '\ r' как обычный текст, а не как новую строку. Чтобы обойти это, я пытаюсь использовать фильтр Mutate, чтобы переписать символы '\ r' на '\ n'. Мутация работает, но Грок по-прежнему видит в ней одну большую строку. и _grokparsefailure.

Мои "нормальные" строки файла журнала Grok, как и ожидалось.

Конфиг

input {
     file {
             path => "/home/pa_stg/runs/2015-12-09-cron-1449666001/run.log"
             start_position => "beginning"
             sincedb_path => "/data/logstash/sincedb"
             stat_interval => 300
             type => "spark"
     }
}
filter{
     mutate {
             gsub => ["message", "\r", "
"]
     }
     grok {
             match => {"message" => "\A%{DATE:date} %{TIME:time} %{LOGLEVEL:loglevel} %{SYSLOGPROG}%{GREEDYDATA:data}"}
             break_on_match => false
     }
}
output{
     stdout { codec => rubydebug }
}

Вход

Этот образец из входного файла иллюстрирует проблему. Символы ^ M показывают, как vim отображает возврат каретки '\ r' ('more' скрывает большинство из них). Я оставил строку как есть, чтобы вы могли видеть, что все это отображается в Linux и File Plugin как одна строка текста.

^M[Stage 79:=======>                                               (30 + 8) / 208]^M[Stage 79:============>                                          (49 + 8) / 208]^M[Stage 79:=================>                                     (65 + 8) / 208]^M[Stage 79:=====================>                                 (83 + 8) / 208]^M[Stage 79:===========================>                          (105 + 8) / 208]^M[Stage 79:===============================>                      (122 + 8) / 208]^M[Stage 79:====================================>                 (142 + 8) / 208]^M[Stage 79:=========================================>            (161 + 8) / 208]^M[Stage 79:==============================================>       (180 + 6) / 208]^M[Stage 79:==================================================>   (195 + 3) / 208]^M[Stage 79:=====================================================>(206 + 1) / 208]^M                                                                                ^M^M[Stage 86:==============>                                        (55 + 8) / 208]^M[Stage 86:===================>                                   (75 + 8) / 208]^M[Stage 86:==========================>                           (101 + 8) / 208]^M[Stage 86:===============================>                      (123 + 8) / 208]^M[Stage 86:======================================>               (147 + 8) / 208]^M[Stage 86:============================================>         (173 + 6) / 208]^M[Stage 86:==================================================>   (193 + 3) / 208]^M[Stage 86:=====================================================>(205 + 1) / 208]^M                                                                                ^M^M[Stage 93:===================>                                   (74 + 8) / 208]^M[Stage 93:===========================>                          (104 + 8) / 208]^M[Stage 93:==================================>                   (132 + 8) / 208]^M[Stage 93:========================================>             (157 + 9) / 208]^M[Stage 93:================================================>     (186 + 6) / 208]^M[Stage 93:=====================================================>(206 + 2) / 208]^M                                                                                ^M15/12/09 13:03:46 INFO SomethingProcessor$: Something Processor completed
15/12/09 13:04:44 INFO CassandraConnector: Disconnected from Cassandra cluster: int

Выход

{
       "message" => "\n[Stage 79:=======>                                               (30 + 8) / 208]\n[Stage 79:============>
                             (49 + 8) / 208]\n[Stage 79:=================>                                     (65 + 8) / 208]\n[Stage 79:===
==================>                                 (83 + 8) / 208]\n[Stage 79:===========================>                          (105 + 8
) / 208]\n[Stage 79:===============================>                      (122 + 8) / 208]\n[Stage 79:====================================>
               (142 + 8) / 208]\n[Stage 79:=========================================>            (161 + 8) / 208]\n[Stage 79:================
==============================>       (180 + 6) / 208]\n[Stage 79:==================================================>   (195 + 3) / 208]\n[St
age 79:=====================================================>(206 + 1) / 208]\n
                  \n\n[Stage 86:==============>                                        (55 + 8) / 208]\n[Stage 86:===================>
                            (75 + 8) / 208]\n[Stage 86:==========================>                           (101 + 8) / 208]\n[Stage 86:====
===========================>                      (123 + 8) / 208]\n[Stage 86:======================================>               (147 + 8)
 / 208]\n[Stage 86:============================================>         (173 + 6) / 208]\n[Stage 86:========================================
==========>   (193 + 3) / 208]\n[Stage 86:=====================================================>(205 + 1) / 208]\n
                                                     \n\n[Stage 93:===================>                                   (74 + 8) / 208]\n[S
tage 93:===========================>                          (104 + 8) / 208]\n[Stage 93:==================================>
   (132 + 8) / 208]\n[Stage 93:========================================>             (157 + 9) / 208]\n[Stage 93:============================
====================>     (186 + 6) / 208]\n[Stage 93:=====================================================>(206 + 2) / 208]\n
                                                                 \n15/12/09 13:03:46 INFO SomethingProcessor$: Something Processor com
pleted",
      "@version" => "1",
    "@timestamp" => "2015-12-09T22:16:52.898Z",
          "host" => "ip-10-252-1-225",
          "path" => "/home/something/pa_stg/runs/2015-12-09-cron-1449666001/run.log",
          "type" => "spark",
          "tags" => [
        [0] "_grokparsefailure"
    ]
}

Мне нужен Grok, чтобы разобрать эту строку, как новую строку '\ n'. Кто-нибудь знает, как это исправить?

15/12/09 13:03:46 INFO SomethingProcessor$: Something Processor completed

person Jeremiah Adams    schedule 09.12.2015    source источник
comment
Ваш ввод не соответствует вашему выводу. На входе 142 + 8, а на выходе 49 + 8.?   -  person Alain Collins    schedule 10.12.2015
comment
Спасибо @AlainCollins. Хорошие глаза. Кажется, что команда linux 'more' не отображала всю строку. Я предполагаю, что это связано с возвратом каретки. Я обновил исходный вопрос с помощью вывода из vim, в котором есть вся рассматриваемая строка.   -  person Jeremiah Adams    schedule 10.12.2015
comment
Если он поступает в виде одной строки (и вы не можете изменить то, что записывает файл), тогда может сработать фильтр «split». Он создает несколько событий из одного документа.   -  person Alain Collins    schedule 10.12.2015


Ответы (1)


Я считаю, что то, что вы ищете, может быть многострочным фильтром.

https://www.elastic.co/guide/en/logstash/current/plugins-filters-multiline.html

Если я правильно помню, этот фильтр отвечает за решение, является ли строка журнала новой строкой или нет. Например, я использую его для объединения всех строк, которые не начинаются с «[INFO]».

    multiline {
            pattern => "^\[%{LOGLEVEL}\]"
            negate => true
            what => "previous"
    }

Надеюсь, это поможет

person pandaadb    schedule 10.12.2015