Преобразование формата даты в формат YYYY-MM-DD из формата YYYY / MM / DD HH: MM: SS в Logstash для журналов ошибок nginx

У меня есть журналы ошибок nginx в следующей форме: -

2015/09/30 22:19:38 [ошибка] 32317 # 0: * 23 [lua] response.lua: 61: handler (): ошибка Cassandra: ошибка при УНИКАЛЬНОЙ проверке: ошибка Cassandra: соединение отказано, клиент: 127.0.0.1. 0.1, сервер:, запрос: «POST / потребители / HTTP / 1.1», хост: «localhost: 8001»

Как уже упоминалось, здесь Я могу проанализировать эти журналы.

Моя конфигурация фильтра выглядит следующим образом: -

filter {  
  grok {
      match => {
        "message" => [
          "%{DATESTAMP:mydate} \[%{DATA:severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{GREEDYDATA:mymessage}",
          "%{DATESTAMP:mydate} \[%{DATA:severity}\] %{GREEDYDATA:mymessage}",
          "%{DATESTAMP:mydate} %{GREEDYDATA:mymessage}"
        ]
      }
      add_tag => ["nginx_error_pattern"]
    }

    if ("nginx_error_pattern" in [tags]) {      
      grok {
        match => {
          "mymessage" => [
            "server: %{DATA:[request_server]},"
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "host: \"%{IPORHOST:[request_host]}:%{NUMBER:[port]}\""
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "request: \"%{WORD:[request_method]} %{DATA:[request_uri]} HTTP/%{NUMBER:[request_version]:float}\""
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "client: %{IPORHOST:[clientip]}",
            "client %{IP:[clientip]} "
          ]
        }        
      }

      grok {
        match => {
          "mymessage" => [
            "referrer: \"%{DATA:[request_referrer]}\""
          ]
        }       
      }                
    }
}

mydate имеет дату в форме: -

"mydate" => "15/09/30 22:19:38"

Может ли кто-нибудь сообщить мне, как я могу добавить еще одно поле (скажем, log_day) с датой в форме 2015-09-30?


person tuk    schedule 06.10.2015    source источник


Ответы (1)


Всегда рекомендуется сохранять время / дату в поле типа date. Это позволяет вам делать сложные запросы диапазона с помощью Elasticsearch или Kibana.

Для анализа Дата.

Фильтр:

date {
    match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
}

Результат:

"@timestamp" => "2015-09-30T20:19:38.000Z"

Фильтр даты по умолчанию помещает результат в поле @timestamp.

Чтобы избежать сопоставления по умолчанию с полем @timestamp, укажите целевое поле, например "log_day", например следующее:

Фильтр:

date {
    match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
    target => "log_day"
}

Результат:

"log_day" => "2015-09-30T20:19:38.000Z"

Когда у вас есть поле типа date, вы можете продолжить дальнейшие операции. Вы можете использовать фильтр date_formatter, чтобы создать другое поле даты в вашем специальном формате.

date_formatter {
        source => "log_day"
        pattern => "YYYY-MM-dd"
}

Результат: "log_day" => "2015-09-30"

person hurb    schedule 06.10.2015
comment
Спасибо @hurb. Это работает, как ожидалось. У меня есть дополнительный вопрос. Можем ли мы сделать это, не изменяя поле @timestamp? Сейчас это заменит @timestamp датой в журнале. - person tuk; 06.10.2015
comment
Конечно, просто добавьте target => "log_day" в свой фильтр даты. Смотрите, как я редактирую. - person hurb; 06.10.2015