2014-05-21 13 views
9

Używam Grok & Logstash do wysyłania dzienników dostępu z Nginx do wyszukiwania elastycznego. Daję Logstashowi wszystkie moje logi dostępu (z dziką kartą, działa dobrze) i chciałbym uzyskać nazwę pliku (, część jego, dokładnie) i użyć go jako pola.Użyj grok, aby dodać nazwę pliku dziennika jako pole logstash

Mój config wygląda następująco:

input { 
    file { 
    path => "/var/log/nginx/*.access.log" 
    type => "nginx_access" 
    } 
} 

filter { 
    if [type] == "nginx_access" { 
    grok { 
     match => { "message" => "%{COMBINEDAPACHELOG}" } 
     match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" } 
     add_field => { "app" => "%{app}" } 
    } 
    } 
} 
output{ 
    # whatever 
} 

Ale to nie wydaje się działać: pole app dodaje, ale ma wartość %{app} (nie zastąpiony).

Próbowałem różnych rzeczy, ale bezskutecznie. Może brakuje mi czegoś ... Jakieś pomysły?

dziękuję

+0

możliwe duplikat [Logstash: jak dodać nazwę pliku jako pole] (http://stackoverflow.com/questions/22916200/logstash-how-to-add-file-name-as-a -field) – OhadR

Odpowiedz

13

Ok, znalazłem go. grok domyślnie blokuje dopasowanie. Tak więc pierwszy mecz jest dobry, pomija drugi.

Rozwiązałem to tak:

filter { 
    if [type] == "nginx_access" { 
    grok { 
     match => { "message" => "%{COMBINEDAPACHELOG}" } 
     match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" } 
     break_on_match => false 
    } 
    } 
} 
+2

Po prostu zauważę, że pole używane dla wiadomości, które zostały przekazane z logstash-forwarderem (aka lumberjack) nie jest 'path', ale' file'. Wszystko inne działa idealnie. – GhostLyrics

0

znalazłem go bardziej pożądane stosowanie 2 bloki Grok jeśli nie będzie unmatching linie w plikach logów.

filter { 
    if [type] == "nginx_access" { 
    grok { 
     match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" } 
    } 
    grok { 
     match => { "message" => "%{COMBINEDAPACHELOG}" } 
    } 
    } 
} 
Powiązane problemy