Moje dzienniki są sformatowane tak:Logstash grok multiline wiadomość
2014-06-19 02:26:05,556 INFO ok
2014-06-19 02:27:05,556 ERROR
message:space exception
at line 85
solution:increase space
remove files
Istnieją 2 rodzaje zdarzeń:
-log w jednej linii jak pierwszy
-log na stwardnienie linii jak drugi Jestem w stanie przetworzyć jedno liniowe zdarzenie, ale nie jestem w stanie przetworzyć drugiego typu, w którym chciałbym przechowywać wiadomość w jednej zmiennej, a rozwiązanie w innej .
To jest mój config:
input {
file {
path => ["logs/*"]
start_position => "beginning"
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601} "
negate => true
what => previous
}
}
}
filter {
#parsing of one line event
grok {
patterns_dir => "./patterns"
match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} ok"]
}
#the parsing fail, so we assumed we are in multiline events, now I process them and I am stuck when I am getting to the new line.
if "_grokparsefailure" in [tags] {
grok {
patterns_dir => "./patterns"
match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level}\r\n"]
}
}
}
Więc to jest to, co mam zrobić, a chciałbym mieć w moim wyjścia konsoli następujące:
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"INFO"
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"ERROR"
"message" => "space exception at line 85"
"solution"=>"increase space remove files"
}
Konkretnie chciałbym uzyskać całe wyrażenie między dwoma słowami ("komunikat" i "rozwiązanie" dla zmiennej komunikatu, "rozwiązanie" i koniec zdarzenia dla zmiennej rozwiązania) i to bez względu na to, czy wyrażenie występuje w jednym, czy w wielu wierszach.
góry dzięki
Czy próbowałeś po prostu 'wiadomość: (?. *) rozwiązanie :( *)'?.? Nie wiem, czy. dopasowuje znak nowej linii w grok lub nie - jeśli nie, możesz wpisać '[. \ r \ n] * zamiast". * ' –
Alcanzar