我使用logstash来解析异常日志,这些日志通过TCP通过网络发送。因为异常日志是多行的,所以我使用多行过滤器来解析数据。不幸的是,发送的最后一个异常日志没有被识别,因为logstash不知道它在哪里结束(由于多行模式)。有没有可能认出它的终点呢?异常的结尾可以是任何东西(那么如何进行正则表达式呢?)或者,有没有可能知道,因为TCP流结束了,这意味着异常也到达了它的末尾?
下面是我的logstash配置文件:
input {
tcp {
port => 1337
type => "exception"
}
}
filter {
if [type] == "exception" {
multiline {
pattern => "%{TIMESTAMP_ISO8601}"
negate => true
what => previous
}
grok {
match => ["message", "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level} \(%{INT:log_level_code}\): exception '%{DATA:exception_name}' with message '%{DATA:exception_message}' in %{PATH:path} Stack trace: %{GREEDYDATA:stack_trace}"]
remove_field => ["log_level", "log_level_code", "host"]
}
date {
match => ["timestamp", "ISO8601"]
}
}
}
output {
elasticsearch { host => localhost }
stdout {}
}下面是一个通过TCP发送异常的示例PHP脚本:
<?php
$content = "2014-11-25T20:11:55+00:00 ERR (3):
exception 'Exception' with message 'some error' in /private/var/www/index.php:88
Stack trace:
#0 {main}
2014-11-25T20:11:56+00:00 ERR (3):
exception 'Exception' with message 'some error' in /private/var/www/index.php:88
Stack trace:
#0 {main}";
$fp = stream_socket_client("tcp://127.0.0.1:1337", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, $content);
fclose($fp);
}运行此示例将只将第一个异常识别为事件日志。一旦下一个时间戳到达,就会识别第二个异常,在这种情况下,当数据流结束时不会识别第二个异常。
发布于 2014-12-01 04:07:12
多行编解码器不支持刷新最后一个事件。多行过滤器有一个enable_flush参数,但它被列为不用于生产。
可悲的是,唯一的解决方案是有更多的例外:)
发布于 2015-03-28 07:25:34
1.5.0 (当前作为RC提供)更正了此问题,但仅适用于多行过滤器。Original JIRA bug,closed GitHub issue.
我也遇到了同样的问题,恰巧发生在Jira/GitHub的讨论中。它花了几次尝试,但我确实让它工作了。我建议您在等待flush事件发生时要有耐心--它会等待几秒钟。
https://stackoverflow.com/questions/27212746
复制相似问题