Как правильно установить метку времени в logstach из журнала iis

Я пытаюсь разобрать файлы журнала iis с помощью logstash и отправить их в elasticsearch.

У меня есть следующая строка журнала

2014-02-25 07:49:32 172.17.0.96 GET /config/integration - 80 - 172.17.28.37 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/33.0.1750.117+Safari/537.36 401 2 5 15

И используйте этот фильтр:

filter {
    if [message] =~ "^#" {
    drop {}
  }

  grok {
    match => ["message", "%{TIMESTAMP_ISO8601} %{IP:host_ip} %{URIPROTO:method} %{URIPATH:path} (?:-|%{NOTSPACE:uri_query}sern) %{NUMBER:port} %{NOTSPACE:username} %{IP:client_ip} %{NOTSPACE:useragent} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:timetaken}"]
  }
  date {
     match => ["logtime", "YYYY-MM-dd HH:mm:ss"]  
  } 
}

Все анализируется правильно, но в результате поле @timstamp — это время, когда я запускаю анализ, а не время события журнала. Это приводит к тому, что все события журнала складываются вместе в то время, когда я запускаю logstash при их просмотре. Я хотел бы, чтобы @timestamp был временем фактического события.

Что я делаю не так?


person Jon    schedule 26.02.2014    source источник


Ответы (2)


Во-первых, вы можете указать поле времени журнала в grok. Затем вы используете фильтр даты, чтобы проанализировать время журнала до @timestamp. @timestamp будет обновлен до времени журнала. Например,

filter {
    if [message] =~ "^#" {
        drop {}
    }

    grok {
        match => ["message", "%{TIMESTAMP_ISO8601:logtime} %{IP:host_ip} %{URIPROTO:method} %{URIPATH:path} (?:-|%{NOTSPACE:uri_query}sern) %{NUMBER:port} %{NOTSPACE:username} %{IP:client_ip} %{NOTSPACE:useragent} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:timetaken}"]
    } 
    date {
         match => ["logtime", "YYYY-MM-dd HH:mm:ss"]  
    }
}
person Ben Lim    schedule 26.02.2014
comment
Спасибо за предложение, к сожалению, я не могу заставить его работать. Поле @timestamp по-прежнему указывает время запуска сценария logstash, а не время события. - person Jon; 27.02.2014

Я решил это, не осознавая, что мне нужно сохранить время из записи журнала во что-то, в данном случае eventtime

grok {
    match => ["message", "%{DATESTAMP:eventtime} %{IP:host_ip} %{URIPROTO:method} %{URIPATH:path} (?:-|%{NOTSPACE:uri_query}sern) %{NUMBER:port} %{NOTSPACE:username} %{IP:client_ip} %{NOTSPACE:useragent} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:timetaken}"]
  } 

а затем используйте это значение для установки @timestamp (которое является неявным целевым полем фильтра даты)

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

небольшой ошибкой был формат без начального года в выражении даты, я думаю, DATESTAMP удаляет век из года.

person Jon    schedule 27.02.2014
comment
На самом деле мой ответ близок к вашему ответу, вам не нужно публиковать его снова. - person Ben Lim; 27.02.2014
comment
Ах, теперь я вижу, что не уделил должного внимания, установив ваш ответ как принятый :) - person Jon; 27.02.2014