3

私のシステムには、logstash、kibana、elasticsearch がインストールされており、次のフィルター構成になっています。

    filter{
if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    mutate {
            add_field => {
                            "timestamp" => "%{TIME} %{MONTH} %{monthday}"
                         }
        }

    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

次のようにkibanaで出力を受け取ります。 キバナ出力

@timestamp @version _id _index _type _file ログ レベル ホスト名 ホスト IP プロセス名 応答時間

タイムスタンプを追加しようとしましたが、動的結果の代わりに同じ文字列を出力しました

キバナ出力

4

1 に答える 1

0

パターンとフィールドを混同しています。

パターンは、「\b\w+\b」のショートカットとしての %{WORD} など、正規表現を表す簡略表記です。

フィールドは、パターンに一致する情報を含むデータが格納される場所です。%{WORD:my_field} のようにパターンをフィールドに入れることができます。

grok{} では、%{SYSLOGTIMESTAMP:syslog_timestamp} と一致します。これは、一致したすべてのものを syslog_timestamp という 1 つのフィールドに入れます。これは、syslog メッセージの先頭に表示される月、月日、および時刻です。

SYSLOGTIMESTAMP 自体は「%{MONTH} +%{MONTHDAY} %{TIME}」と定義されていますが、「:name」構文がないため、MONTH、MONTHDAY、および TIME のフィールドは作成されません。

説明した形式で新しいフィールドを本当に作成したい場合は、次のいずれかを行う必要があります。

  1. 情報からフィールドを作成するすべての SYSLOGTIMESTAMP を置き換える新しいパターンを作成します。
  2. 既存のパターンを使用して syslog_timestamp フィールドを作成し、単純なパターンでそれを分割して分割します。{}

#2をお勧めしますので、最終的には次のようになります。

grok {
      match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" }
}

それはそれを行う必要があります。

フィールドは文字列になるため、範囲クエリなどでは使用できないことに注意してください。date{} フィルタを使用して、@timestamp を syslog_timestamp 情報に置き換える必要があります。

幸運を。

于 2015-01-22T07:26:06.390 に答える