-1

logstash 出力から目的のタイム スタンプ形式を取得しようとしています。syslog でこの形式を使用すると、それを取得できません

Yyyy-mm-ddThh:mm:ss.sssZ 形式のような _source フィールドにある他の形式への変換についての考えを共有してください。

filter {
  grok {
        match => [ "logdate", "Yyyy-mm-ddThh:mm:ss.sssZ" ]
       overwrite => ["host", "message"]
  }

_source: {
message: "activity_log: {"created_at":1421114642210,"actor_ip":"192.168.1.1","note":"From system","user":"4561c9d7aaa9705a25f66d","user_id":null,"actor":"4561c9d7aaa9705a25f66d","actor_id":null,"org_id":null,"action":"user.failed_login","data":{"transaction_id":"d6768c473e366594","name":"user.failed_login","timing":{"start":1422127860691,"end":14288720480691,"duration":0.00257},"actor_locatio

このコードをsyslogファイルで使用しています

filter {
  if [message] =~ /^activity_log: / {
    grok {
      match => ["message", "^activity_log: %{GREEDYDATA:json_message}"]
    }
    json {
      source => "json_message"
      remove_field => "json_message"
    }
    date {
      match => ["created_at", "UNIX_MS"]
    }
    mutate {
      rename => ["[json][repo]", "repo"]
      remove_field => "json"
    }
  }
}

output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

ありがとう

"message" => "<134>feb  1 20:06:12 {\"created_at\":1422765535789, pid=5450 tid=28643 version=b0b45ac proto=http  ip=192.168.1.1 duration_ms=0.165809 fs_sent=0 fs_recv=0 client_recv=386 client_sent=0 log_level=INFO msg=\"http op done: (401)\" code=401" }
      "@version" => "1",
    "@timestamp" => "2015-02-01T20:06:12.726Z",
          "type" => "activity_log",
          "host" => "192.168.1.1"
4

1 に答える 1

0

grok フィルターのパターンが意味をなさない。Grok パターンではなく Joda -Time パターン (通常は日付フィルターに使用) を使用しています。

messageフィールドに JSON オブジェクトが含まれているようです。解析が容易になるので、これは良いことです。「activity_log:」以降の部分を一時json_messageフィールドに抽出し、

grok {
  match => ["message", "^activity_log: %{GREEDYDATA:json_message}"]
}

json フィルターを使用してそのフィールドを JSON として解析します(操作が成功した場合は一時フィールドを削除します)。

json {
  source => "json_message"
  remove_field => ["json_message"]
}

これで、メッセージの最上位レベルに元のメッセージ フィールドのフィールドが表示されますcreated_at。これには、抽出するタイムスタンプを含むフィールドが含まれます。その数値はエポックからのミリ秒数であるため、日付フィルターで UNIX_MS パターンを使用して、次のように抽出でき@timestampます。

date {
  match => ["created_at", "UNIX_MS"]
}
于 2015-02-03T06:54:42.187 に答える