2016-07-15 1 views
3

Я переправляю свои журналы докеров с помощью драйверов syslog в logstash. Это отлично работает для обычных строк журнала, но имеет проблемы с многостроками. Проблема, с которой я сталкиваюсь, заключается в том, что пересылка журналов докеров добавляет формат сообщения syslog к каждой строке журнала. Если я использую многострочный фильтр logstash (который не рекомендуется), я могу успешно комбинировать многострочные линии и удалять сообщения syslog в дополнительных строках ... однако это не является потокобезопасным. Я не могу заставить логику работать через входной кодек, что и рекомендует logstash.Драйвер docker syslog с обработкой multline в logstash

Так, например:

Докер Команда:

docker run --rm -it \ 
     --log-driver syslog \ 
     --log-opt syslog-address=tcp://localhost:15008 \ 
     helloWorld:latest 

Журналы в контейнере DOCKER:

Log message A 
<<ML>> Log message B 
    more B1 
    more B2 
    more B3 
Log message C 

Бревна, как полученные в logstash

<30>Jul 13 16:04:36 [1290]: Log message A 
<30>Jul 13 16:04:37 [1290]: <<ML>> Log message B 
<30>Jul 13 16:04:38 [1290]: more B1 
<30>Jul 13 16:04:39 [1290]: more B2 
<30>Jul 13 16:04:40 [1290]: more B3 
<30>Jul 13 16:04:41 [1290]:Log message C 

Теперь я могу получить все, чтобы разобрать, как я хочу, используя следующий фильтр:

logstash фильтр многострочный

input { 
    tcp { 
    port => 15008 
    type => "multiline" 
} 
} 

filter { 
    if ([type] == "multiline") { 
    grok { 
     match => { "message" => [ 
     "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)" 
     ]} 
    } 

    multiline { 
     pattern => "^[\s\S]*\<\<[M][L]\>\>" 
     negate => true 
     what => "previous" 
     source => "newMessage" 
     stream_identity => "%{host}.%{pid}" 
    } 
} 

Это именно то, что я хочу в моих logstash сообщений

message: Log message A 
message: <<ML>> Log message B more B1 more B2 more B3 
message: Log message C 

Однако, который работает в течение нескольких минут ... но потом зависает и прекращает обработке

Попытки получить его на работу с помощью кодека многострочного, который logstash рекомендацию

logstash кодек многострочного

input { 
     tcp { 
     port => 15008 
     type => "multiline" 
     codec => multiline { 
     pattern => "^[\s\S]*\<\<[M][L]\>\>" 
     negate => true 
     what => "previous" 
     } 
    } 
    } 

    filter { 
     if ([type] == "multiline") { 
     grok { 
      match => { "message" => [ 
      "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)" 
      ]} 
     } 
    } 

Он сочетает в себе мультилиний правильно, но теперь я получаю эти сообщения системного журнала, смешанные в моих многострочных сообщений

выход

message: Log message A 
message: <<ML>> Log message B <30>Jul 13 16:04:38 [1290]: more B1 <30>Jul 13 16:04:39 [1290]: more B2 <30>Jul 13 16:04:40 [1290]: more B3 
message: Log message C 

Любая помощь, чтобы получить обработку кодека для вывода как фильтр один будет оценен.

Спасибо, Dan

+0

Можете ли вы объяснить немного больше о 'те Syslog messages'? Можете ли вы опубликовать пример, где он смешивается, показывая смешанные журналы вывода? –

ответ

0

Хорошо, я получил эту работу, используя logstash кодек многострочный с добавлением еще один фильтр после матча ГРОК

mutate { 
     gsub => [ 
     "message", "<\d*>[\s\S]*?\[\d*\]:.", " " 
     ] 
    } 
+0

Не могли бы вы добавить еще несколько объяснений, почему это работает и в чем проблема? – herm

Смежные вопросы