私は少し混乱しています。私はsyslog date (backfilling the logstash)
を引き出して@timestamp
をそれに置き換えようとしています。私はほとんどすべてを試しました。
これは私のフィルターです
filter {
if [type] == "syslog" {
grok {
match => {
"message" => ["%{SYSLOGTIMESTAMP:DATETIME} %{Word:SERVER} (?<BINARY>(.*?)(php\-cgi|php))\: %{DATA:PHP_ERROR_TYPE}\:\s\s(?<PHP_ERROR_DESC>(.*?)(e\s\d))""]
}
}
date {
match => { "DATETIME" => [ "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ] }
target => "@timestamp"
add_tag => [ "tmatch" ]
}
if !("_grokparsefailure" in [tags]) {
mutate {
replace => [ "@source_Host", "%{SERVER}" ]
}
}
mutate {
remove_field => [ "SERVER" ]
}
}
}
出力例:
{
"message" => "Sep 10 00:00:00 xxxxxxx",
"@timestamp" => "2013-12-05T13:29:35.169Z",
"@version" => "1",
"type" => "xxxx",
"Host" => "127.0.0.1:xxx",
"DATETIME" => "Sep 10 00:00:00",
"BINARY" => "xxxx",
"PHP_ERROR_TYPE" => "xxxx",
"PHP_ERROR_DESC" => "xxxxx",
"tags" => [
[0] "tmatch"
],
"@source_Host" => "xxx"
}
tmatchはタグに含まれているので、日付フィルターが機能すると想定していますが、なぜまだそうなのですか?
@timestamp => "2013-12-05T13:29:35.169Z"
?
助けてくれてありがとう(私のlogstash
はlogstash-1.2.2-flatjar.jar
)
日付フィルターを見てみましょう:
date {
match => { "DATETIME" => [ "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ] }
target => "@timestamp"
add_tag => [ "tmatch" ]
}
特に、 match パラメータ:
match => { "DATETIME" => [ "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ] }
一致には配列が必要です。あなたが正確に何を渡しているかはわかりませんが、配列ではありません。これを-v
で実行してみましたが、文句を言わないことに驚いています。
あなたはおそらくこれに近いものを意味します:
match => ["DATETIME", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
配列の最初の要素がターゲットフィールドであることに注意してください。追加の要素は、照合するパターンです。
それを過ぎると、本当に必要な1つの形式のみを渡す必要がありますが、それは送信する3つの形式に含まれているようです。
タイムスタンプをUTC時間ではなくタイムゾーン形式で表示したい場合は、次のようにできます
Ruby {
code => "event['@timestamp'] = event['@timestamp'].local('-08:00')"
}
前:@timestamp => "2013-12-05T13:29:35.169Z"
後:@timestamp => "2013-12-05T05:29:35.169-08:00"
更新:ローカルメソッドはバージョン1.4.2では機能しません。したがって、別のAPIを変更します
Ruby {
code => "event['@timestamp'] = event['@timestamp'].getlocal"
}