2015-10-06 2 views
3

Я имеющих Nginx журналы ошибок в следующей форме: -Преобразование формата даты YYYY-MM-DD от YYYY/MM/DD HH: MM: СС в Logstash для журналов ошибок Nginx

2015/09/30 22:19:38 [error] 32317#0: *23 [lua] responses.lua:61: handler(): Cassandra error: Error during UNIQUE check: Cassandra error: connection refused, client: 127.0.0.1, server: , request: "POST /consumers/ HTTP/1.1", host: "localhost:8001"

Как here Я могу разобрать эти журналы.

Моя конфигурация фильтра, как ниже: -

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?

ответ

3

Всегда полезно сохранить время/дату в поле типа date. Это позволяет вам делать complex range queries с Elasticsearch или Kibana.

Вы можете использовать logstash's date filter, чтобы разобрать дату.

Фильтр:

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"

+0

Благодаря @hurb. Это работает как ожидалось. У меня есть следующий вопрос. Можем ли мы это сделать без изменения поля '@ timestamp'? Прямо сейчас это перезапишет '@ timestamp' с датой в журнале. – tuk

+0

Конечно, просто добавьте 'target =>" log_day "' в свой фильтр даты. См. Редактирование. – hurb

Смежные вопросы