Я пытаюсь проанализировать некоторые журналы Tomcat с помощью logstash, вот пример данных:
07-05-19 11:24:32 INFO [XmlWebApplicationContext] Closing Root WebApplicationContext: startup date [Wed Apr 10 15:58:07 CEST 2019]; root of context hierarchy" >> /var/lib/docker/volumes/test1/_data/tomcat.misc.log
09-05-19 10:25:00 WARN [BasicResourcePool] com.mchange.v2.resourcepool.BasicResourcePool@74f26dc -- Acquisition Attempt Failedclear! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception:
org.postgresql.util.PSQLException: Connection to ii refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:265)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner .run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.net.ConnectException: Network is unreachable (connect failed)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
... 13 more
Я видел в других темах, что многоканальный плагин и шаблоны полезны:
Файл шаблона:
JAVA_TRACE (^.+Exception: .+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Caused by:.+)
Файл конфигурации Logstash:
input {
udp{
port => 12201
}
tcp{
port => 12201
codec => multiline {
patterns_dir => ["/conf/patterns"]
pattern => "^%{JAVA_TRACE}"
negate => "true"
what => "previous"
}
}
}
filter{
grok{
patterns_dir => ["/conf/patterns"]
match => {message => ["(^%{DATE_EU:date} %{TIME:time} %{LOGLEVEL})"]}
tag_on_failure => ["failed"]
}
}
output{
elasticsearch{
hosts => ["elasticsearch:9200"]
index => "tomcat_misc"
}
}
Просто для информации, вот мой конфиг клиента syslog-ng:
source s_test{
wildcard-file(
base-dir("/tmp")
filename-pattern("*log")
flags(no-parse)
);
};
template no_header{
template("$MSG\n");
template_escape(no);
};
destination d_siem{
tcp(X.X.X.X port(12201) template(no_header));
};
log {
source(s_test);
destination(d_siem);
};
Проблема в том, что, когда я использую этот конфиг, простые строки хорошо анализируются, но строки трассировки стека возвращают «сбойный» тафг, как будто они не интерпретируются в многоканальном кодеке. Например, строка «at com. [...]. Run» сохраняется как одна строка журнала, а не как часть многострочных журналов.
Я проверил на сайте регулярных выражений, что мой шаблон JAVA_TRACE является правильным и совпадает с моими трассировками стека, поэтому я не понимаю, почему кодек не работает ... у кого-нибудь есть идея?
Спасибо за помощь