2016-06-01 10 views
2

Ich brauche zwei Variablen von diesem Pfad zu erfassen grok mit:Wie analysieren Sie Text in grok

/opt/data/app_log/server101.log 

server=needs to be anything after the last forward slash before the dot (in this case server101) 
index=needs to be the text between the last two forward slashes (in this case app_log) 

Irgendwelche Ideen, wie dies tun könnte in grok?

grok { 
       patterns_dir => ["/pattern"] 
       match =>{path =>"%{WORD:dir1}\/%{WORD:dir2}\/%{WORD:index_name}\/%{WORD:server}\.%{WORD:file_type}"} 
       match => {"message" => "%{TIMESTAMP_ISO8601:timestamp},%{NUMBER:Num_field} %{WORD:error_level} %{GREEDYDATA:origin}, %{WORD:logger} - %{GREEDYDATA:message}"} 
     } 

Antwort

1

einfachste Lösung ist

/%{DATA:col1}/%{DATA:col2}/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end} 

Sie die Namen entfernen col1, col2 und end diese Aufnahmen fallen.

Dieses Muster beruht darauf, dass in Ihrer URI immer die gleiche Anzahl von Teilen vorhanden ist. Wenn es eine variable Zahl gibt, könnten Sie so etwas verwenden.

(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end} 

I hergestellt und getestet diese mit the grok constructor


Mit diesem Muster:

filter { 
    grok { 
    match => { 
     "message" => <message-pattern> 
    } 
    } 
    grok { 
    match => { 
     "log_path" => "(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA}" 
    } 
    } 
} 

Wo "log_path" ist der Name des Feldes den Protokollpfad enthält, nachdem Sie Ihre normale Nachricht tun Parsing.

+0

Ich muss die Protokolldatei zu analysieren, würde ich in der Lage, zwei unter einem grok, wie die, die ich im ursprünglichen Post geändert habe, enthalten? Wenn ich das tue, kann ich die Felder, die von der Nachricht in meinen ES-Instanzen analysiert werden, nicht sehen. – user1471980

+0

Sie können einen Grok-Filter haben, der das Log analysiert, und einen Grok-Filter, der dieses Muster für das Feld verwendet, das die Pfadzeichenfolge –

+0

zwei verschiedene Groks oder einen Grok enthält, wie oben gezeigt? Wenn ich es wie oben mache, sehe ich nicht das benutzerdefinierte Feld, das ich versuche, aus der Protokolldatei zu extrahieren. – user1471980