как сделать два условия проверки в logstash и написать файл конфигурации лучше

Я использую logstash 1.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 server

1. фильтр.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. выход.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 и только журнал ошибок и предупреждений из/var/log / messages, я знаю, что это не хорошая конфигурация. Я хочу, чтобы кто-нибудь показал мне лучший способ сделать это.

1 ответов


Я предпочитаю принимать решения о событиях в блоке фильтра. Мои блоки ввода и вывода обычно довольно просты. Отсюда я вижу два варианта.

используйте фильтр падения

на drop фильтр приводит к удалению события. Он никогда не доберется до ваших выходов:

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).