Найдите время из файла журнала

Ниже приводится необработанный журнал:

2017-09-17 08:34:54 181409 10.110.82.122 200 TCP_TUNNELED 4440 1320 CONNECT tcp cdn.appdynamics.com 443 / - ANILADE - 10.100.134.6 - - «Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, например, Gecko) Chrome / 60.0.3112.113 Safari / 537.36 "НАБЛЮДАЕМЫЕ" Технологии / Интернет "- 10.100.134.6

Это мой файл конфигурации logstash:

input {
    beats {
        port => "5044"
    }
}

filter 
#start of filter
{
grok 
#start of grok filter
{
match =>
#start of match
{"message"=>"%{TIMESTAMP_ISO8601:@timestamp} (%{NUMBER:time_taken}|\-) (%{IP:sourceIP}|\-) (%{NUMBER:status}|\-) (%{WORD:action}|\-) (%{NUMBER:scBytes}|\-) (%{NUMBER:csBytes}|\-) (%{WORD:method}|\-) (%{WORD:uri_scheme}|\-) (%{URIHOST:url}|\-) (%{NUMBER:port}|\-) (?<uri_path>([a-zA-Z0-9\/\.\?\-\_]+)|(\/)) (?<uri_query>([a-zA-Z0-9\/\.\?\-\=\&\%]+)) (?<username>([a-zA-Z0-9\/\.\?\-]+)) (?<auth_group>([a-zA-Z0-9\/\.\?\-]+)) (?<destIP>([a-zA-Z0-9\.\-]+)) (?<content_type>([a-zA-Z0-9\-\/\;\%\=]+)) (?<referer>[a-zA-Z0-9\-\/\;\%\=\:\.]+) (%{QUOTEDSTRING:user_agent}|\-) (%{WORD:filter_result}|\-) (%{QUOTEDSTRING:category}|\-) (?<vir_id>([a-zA-Z0-9\-\/.])) (%{IP:proxyIP}|\-)"
}
#end of match
}
#end of grok
date
#start of date filter
{
match=>["@timestamp","ISO8601"]
}
#end of date filter
}
#end of filter


output 
{

    elasticsearch 
    {
    hosts => ["localhost:9200"] 
    index => proxylog
    }
}

Я хотел выбрать время из журналов, поэтому я использовал фильтр даты, как предложено в Документация по плагину даты. Но независимо от конфигурации я вижу, что logstash elasticsearch показывает индексированное время в поле @timestamp, когда я просматриваю его в Kibana. Я не могу найти, что мне не хватает или где я ошибаюсь. Я попытался не использовать TIMESTAMP_ISO8601 в фильтре grok, заменив его на

%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{TIME:time}

и добавив метку времени поля как:

add_field=>["timestamp","%{year}-%{month}-%{day} %{time}"]

затем измените конфигурацию фильтра даты как

date{
match=>["timestamp","YYYY-MM-DD HH:mm:ss"]
remove_field=>["timestamp","year","month","day"]}
}

и не нашел удачи. Может ли кто-нибудь указать на решение, поскольку любая цепочка, найденная на форуме elasticsearch и stackoverflow, не помогает. Может ли кто-нибудь сказать мне, нужно ли мне изменять какую-либо конфигурацию filebeat, поскольку я использую filebeat для отправки журналов в logstash.


person Akash    schedule 29.09.2017    source источник
comment
В исходной конфигурации удалите @ в {"message"=>"%{TIMESTAMP_ISO8601:@timestamp} и match=>["@timestamp","ISO8601"] и попробуйте еще раз, пожалуйста? Это могло произойти из-за этого.   -  person baudsp    schedule 29.09.2017
comment
попробует и расскажет, как это происходит. @baudsp   -  person Akash    schedule 30.09.2017


Ответы (2)


вы можете добавить target => "new_field" в свой фильтр даты и использовать его для создания индекса в Kibana

person sharonpearl    schedule 24.10.2017

Вероятно, потому что @timestamp - это поле отметки времени, но ваш grok {} рассматривает его как строку.

Сначала переместите строку в новое поле, например

%{TIMESTAMP_ISO8601:[@metadata][timestamp]}

Затем установите @timestamp, используя фильтр date {} с [@metadata] [timestamp] в качестве входных данных.

person Alain Collins    schedule 08.10.2017
comment
Сложно выполнять итеративную отладку на SO. Может по IRC заскочить? - person Alain Collins; 13.10.2017