4

次のようなログエントリがあります...

2014-02-25 00:00:03,936 INFO  - something happened...bla bla bla
2014-02-25 00:00:03,952 INFO  - ***Request Completed*** [   78.002] mS [http://cloud.mydomain.local/schedule/search?param=45]
2014-02-25 00:00:04,233 INFO  - something else happened...bla bla bla

行を正しく解析する grok フィルターがあります...

grok {
    match => [ "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}" ]
}

「body」が「***Request Completed***」で始まる場合、「body」から追加データを解析したいと思います。つまり、「elaspsedms」と「uri」です。これどうやってするの?

他の場所では、このように grok フィルターに別のメッセージ エントリを追加することが提案されました...

grok {
    match => [ 
              "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- \*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]",
              "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
             ]
}

...これは機能しますが、タイミング ラインの場合、'body' の値は設定されませ。理想的には、body には常にエントリの最後の部分と iff を含めたいと思います。エントリはタイミング ラインであり、eplapsems と uri の追加の解析を実行します。

どうすればこれを行うことができますか?

フィールドを解析する手段はありますか? 'body' をlapsedms/uri に解析しようと試みることができるように、それが失敗した場合は続行します。または、grok 式でフィールドの一致をネストする手段はありますか?

考え?

編集:「体」が常に設定されていることを確認するのではなく、「elaspedms」が設定されている場合、「elaspedms」と「uri」から体を作成できますか?

4

3 に答える 3

3

これは機能します。より良い方法はありますか?

grok {
   match => [ 
          "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- \*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]",
          "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
         ]
}

# if body is NOT set (timing line) make one
if ![body] {
    mutate { 
        add_field => [ "body", "***Request Completed*** [%{elapsedms}] mS [%{uri}]"] 
    }
}
于 2014-02-28T14:25:38.897 に答える
0

I believe you need to use the break_on_match option within grok and set it to false: http://logstash.net/docs/1.4.2/filters/grok#break_on_match

于 2014-12-05T11:22:17.190 に答える