web-dev-qa-db-ja.com

logstashで2つの条件チェックを行い、より適切な構成ファイルを書き込む方法

Logstash1.4.2を使用しています。

私はこのようなクライアントログサーバーにlogstash-forwarder.confを持っています

{
    "network": {
      "servers": [ "xxx.xxx.xxx.xxx:5000" ],
      "timeout": 15,
      "ssl ca": "certs/logstash-forwarder.crt"
    },
  "files": [
       {
          "paths": [ "/var/log/messages" ],
          "fields": { "type": "syslog" }
        },
        {

          "paths": [ "/var/log/secure" ],
          "fields": { "type": "linux-syslog" }
        }
         ]
}

================================================== =======

Logstashサーバー内

1. filter.conf

filter {
  if [type] == "syslog" {
date {
        locale => "en"
        match => ["syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
        timezone => "Asia/Kathmandu"
        target => "@timestamp"
        add_field => { "debug" => "timestampMatched"}
   }
    grok {
      match => { "message" => "\[%{Word:messagetype}\]%{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{Host}" ]
    }
    syslog_pri { }
  }
if [type] == "linux-syslog" {
date {
        locale => "en"
        match => ["syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
        timezone => "Asia/Kathmandu"
        target => "@timestamp"
        add_field => { "debug" => "timestampMatched"}
   }
    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}" ]
    }
    syslog_pri { }
mutate { replace => [ "syslog_timestamp", "%{syslog_timestamp} +0545" ] }

  }
}

================================================== =====

2. output.conf

output {
    if [messagetype] == "WARNING" {
 elasticsearch { Host => "xxx.xxx.xxx.xxx" }
  stdout { codec => rubydebug }
}

 if [messagetype] == "ERROR" {
 elasticsearch { Host => "xxx.xxx.xxx.xxx" }
  stdout { codec => rubydebug }
}

if [type] == "linux-syslog" {
 elasticsearch { Host => "xxx.xxx.xxx.xxx" }
  stdout { codec => rubydebug }
}

}

================================================== =====

すべてのログを/ var/log/secureから転送し、ERRORおよびWARNINGログのみを/ var/log/messagesから転送したいのですが、これは適切な構成ではないことがわかります。私は誰かにこれを行うためのより良い方法を見せてほしい。

7
Err0rr

フィルタブロック内のイベントについて決定することを好みます。私の入力ブロックと出力ブロックは通常、非常に単純です。そこから、2つのオプションが表示されます。

ドロップフィルターを使用する

drop filter により、イベントがドロップされます。それはあなたの出力に到達することは決してありません:

filter {
    #other processing goes here

    if [type] == "syslog" and [messagetype] not in ["ERROR", "WARNING"] {
        drop {}
    }
}

これの利点は、それが非常に単純なことです。

欠点は、イベントがドロップされることです。全く出力されません。それがあなたが望むものなら、それは問題ありません。

タグを使用する

多くのフィルターを使用すると、プラグイン間の決定を伝達するのに役立つタグを追加できます。 ESにイベントを送信するように出力ブロックに指示するタグを添付できます。

filter {
    #other processing goes here

    if [type] == "linux-syslog" or [messagetype] in ["ERROR", "WARNING"] {
        mutate {
            add_tag => "send_to_es"
        }
    }
}

output {
    if "send_to_es" in [tags] {
        elasticsearch {
            #config goes here
        }
    }
}

これの利点は、細かく制御できることです。

これの欠点は、少し手間がかかり、ESデータが少し汚染されてしまうことです(タグはESで表示され、検索可能になります)。

9
rutter