1

logstash の request_uri フィールドから部分文字列を抽出しようとしています。Grok は、apace access-log 行をいくつかのフィールドに分割します (既に機能しています)。そのため、独自のフィールドで request_uri を取得します。ここで、URI のルート コンテキストを取得します。

/en/some/stuff
/ApplicationName/some/path
/fr/some/french/stuff

しかし、en、ApplicationName、fr を独自のフィールド (他のフィールドに追加) に格納する方法がわかりません。このようなものがうまくいくのではないかと考えています。

grok {
            pattern => "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""
            match => [ "new_context_field", "SOME-REGEX fo parse request_uri" ]
        }

ヒントを教えてください。

4

2 に答える 2

3

ご協力いただきありがとうございます。あなたの提案にかなり似ているこのgrok構成で解決しました。

grok {
    patterns_dir => "/path/to/elk-stack/logstash-1.4.2/bin/custom_patterns"

    match => [ "message", "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""]
    match => [ "request_uri", "%{CONTEXTFROMURI:context}" ]

    break_on_match => false
}

単一の grok ブロックで複数の一致を使用するには、必ずbreak_on_match => false. それ以外の場合、最初の一致が成功した場合、2 番目の一致はスキップされます。

于 2015-01-16T12:27:57.160 に答える