Logstash를 사용하여 TCP를 통해 네트워크를 통해 전송되는 예외 로그를 구문 분석합니다. 예외 로그가 여러 줄이므로 데이터를 구문 분석하기 위해 여러 줄 필터를 사용합니다. 불행하게도 마지막 예외 로그는 인식되지 않습니다. logstash는 (여러 줄 패턴으로 인해) 끝나는 곳을 알지 못하기 때문입니다. 그것이 끝나는 곳을 인식하는 것이 가능합니까? 예외의 끝은 무엇이든 될 수 있습니다 (어떻게 정규식을할까요?). 아니면 TCP 스트림이 종료되었는데 예외가 또한 그 끝까지 도달했기 때문에 어떻게 든 알 수 있습니까?Logstash 설정에서 예외 로그의 마지막 예외가 누락되었습니다.
<?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);
}
만 이벤트 로그로 첫 번째 예외를 인식이 예제를 실행 : 여기
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 스크립트입니다 : 여기
내 logstash 구성 파일입니다 . 두 번째 예외는 다음 타임 스탬프가 도착하자마자 인식되며 데이터의 스트림이 끝날 때이 경우가 아닙니다.