Я переправляю свои журналы докеров с помощью драйверов 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
Можете ли вы объяснить немного больше о 'те Syslog messages'? Можете ли вы опубликовать пример, где он смешивается, показывая смешанные журналы вывода? –