Parse Apache2 Журнал ошибок с Grok для Logstash

Я пытаюсь разобрать мой журнал ошибок apache2 и им немного неприятностей. Кажется, он не соответствует фильтру. Я уверен, что элемент timestamp ошибочен, но я не уверен, и я не могу найти документацию, чтобы понять это. Кроме того, есть ли способ получить то, что находится в fields.errmsg для меня @message?

Журнал

[Wed Jun 26 22:13:22 2013] [error] [client 10.10.10.100] PHP Fatal error:  Uncaught exception '\Foo\Bar'

Конфигурация отправителя

input {
        file {
                'path' => '/var/log/apache2/*-error.log'
                'type' => 'apache-error'
        }

}

filter {
        grok {
                type => "apache-error"
                pattern => "\[%{HTTPDATE:timestamp}\] \[%{WORD:class}\] \[%{WORD:originator} %{IP:clientip}\] %{GREEDYDATA:errmsg}"
        }
}


output {
        stdout {}
        redis {
                'data_type' => 'list'
                'host' => 'logstash.server.net'
                'key' => 'logstash'
        }
}

Ответ 1

Ahoy!

Я знаю, что я немного опаздываю на вечеринку, но здесь все идет!

Я создал каталог /etc/logstash/patterns.d/ в системе, а в нем был файл с именем apache-error, содержащий:

APACHE_ERROR_TIME %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}
APACHE_ERROR_LOG \[%{APACHE_ERROR_TIME:timestamp}\] \[%{LOGLEVEL:loglevel}\] (?:\[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:errormsg}

/etc/logstash/patterns.d/ будет указываться в конфигурации logstash следующим образом:

grok {
  patterns_dir => [ "/etc/logstash/patterns.d" ]
  match => [ "message", "%{APACHE_ERROR_LOG}" ]
}

Вы можете проверить это на Grok Debugger, как упоминал Адам в своем комментарии. Кажется, что все отлично работает с записью сэмпла, которую вы отправляете. Работал довольно солидно с одним из моих клиентов.

В приведенном выше шаблоне ставится окончательное сообщение в поле errormsg. Поэтому я просто удаляю поле message.

Это то, что я сейчас использую в моей конфигурации logstash:

filter {
  if [type] == "apache_error_log" {

    grok {
      patterns_dir => [ "/etc/logstash/patterns.d" ]
      match => [ "message", "%{APACHE_ERROR_LOG}" ]
    }

    if !("_grokparsefailure" in [tags]) {

      mutate {
        remove_field => [ "message" ]
        add_field =>  ["timestamp_submitted", "%{@timestamp}"]
      }

      date {
        # Try to pull the timestamp from the 'timestamp' field (parsed above with
        # grok). The apache time format looks like: "18/Aug/2011:05:44:34 -0700"
        #                        Sat Feb 08 06:31:09 2014
        match => [ "timestamp", "EEE MMM dd HH:mm:ss yyyy" ]
        remove_field => [ "timestamp" ]
      }

      geoip {
        source => "clientip"
      }
    }
  }
}

Обратите внимание, что я использую тип apache_error_log вместо apache-error.

Сделайте снимок. Я хотел бы знать, работает ли это для вас и других!

Ура!

Ответ 2

Наши журналы ошибок выглядят немного иначе:

[Tue Dec 08 12:30:35.997887 2015] [ssl:info] [pid 1178:tid 1072] (70014)End of file found: [client 10.129.24.77:49987] AH01991: SSL input filter read failed.

Но я нашел предопределенный шаблон, который отлично работает:

HTTPD24_ERRORLOG

См. это в Источнике Logstash

Ответ 3

В Logstash есть встроенный анализатор журнала Apache.

Вот пример...

grok {
   type    => 'company'
   pattern => ["%{COMBINEDAPACHELOG}"]
   add_tag => "apache"
}

В качестве ссылки вы можете проверить Logstash docs

Ответ 4

Не работает для меня:

EEE MMM dd HH:mm:ss yyyy

Работал для меня (Apache 2.4):

EEE MMM dd HH:mm:ss.SSSSSS yyyy