Проблема с разбором nxlog и elasticsearch

Я запускаю стек ELK и передаю ему все свои журналы Windows из nxlog, и у меня проблема именно с журналами IIS. В nxlog я запускаю это в файле nxlog.conf

<Extension w3c> Module xm_csv Fields $date, $time, $s-ip, $cs-method, $cs-uri-stem, $cs-uri-query, $s-port, $cs-username, $c-ip, $csUser-Agent, $sc-status, $sc-substatus, $sc-win32-status, $time-taken FieldTypes string, string, string, string, string, string, string, string, string, string, string, string, string, string Delimiter ' ' UndefValue - </Extension>

Я не запускаю синтаксический анализ logstash, и когда они появляются в elasticsearch/kibana, я получаю этот гигантский вывод сообщений,

{"message":"2015-10-19 22:17:26 10.10.10.10 GET javascriptScript.js - 443 - 10.10.10.10 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/7.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET4.0C;+.NET4.0E;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729) 200 0 0 31\r","@version":"1","@timestamp":"2015-10-19T22:19:08.061Z","host":"10.10.10.10","type":"WindowsEventLog","tags":["_jsonparsefailure"]}

Я хочу иметь возможность проанализировать это сообщение и получить все соответствующие данные. Похоже, должна быть возможность проанализировать журнал iis через nxlog, а затем передать информацию json в elasticsearch. Но я не уверен, что это то, что я должен делать на стороне nxlog или на стороне logstash. Все, на что я смотрел, использует одно и то же расширение w3c, но нет тонны данных, которые я мог бы просмотреть, используя как nxlog, так и logstash для анализа журналов IIS.


person pcort    schedule 20.10.2015    source источник


Ответы (1)


Вы можете добавить фильтр grok в конфигурацию logstash. В фильтре grok вы можете отразить определение полей из конфигурации nxlog. В основном вы можете использовать такой шаблон:

%{TIMESTAMP_ISO8601:ts}\s%{IP:s_ip}\s%{WORD:cs_method}\s%{DATA:cs_uri_stem}\s%{DATA:cs_uri_query}\s

Это извлекает первую часть полей из вашего сообщения (до cs_uri_query). Если вы хотите извлечь и остальные, просто расширьте шаблон. Вы можете использовать отладчик grok (https://grokdebug.herokuapp.com/), чтобы поиграть с различными узоры. Список предопределенных шаблонов находится здесь: https://github.com/elastic/logstash/tree/v1.4.2/patterns

ОТВЕТ №2: @pcport Кажется, я понимаю, в чем твоя проблема. Вы используете шаблон DATA, это использует нежадное регулярное выражение - оно определяется следующим образом:

DATA .*?

Вы можете либо сообщить reg-expparser, что вы пытаетесь сопоставить до конца строки (просто поставьте $ в конце вашего шаблона), либо, что предпочтительнее, вы сделаете свой шаблон grok более конкретным, используя шаблон NUMBER вместо DATA шаблон. Попробуйте это, например:

%{TIME:time_stamp}\s%{IP:source_ip}\s%{WORD:cs_method}\s%{DATA:cs_uri_stem}\s%{DATA:cs_uri_query}\s%{NUMBER:source_port}\s%{DATA:username}\s%{IP:client_ip}\s%{DATA:client_browser}\s%{NUMBER:request_status}\s%{NUMBER:request_substatus}\s%{NUMBER:win32_status‌​}\s%{NUMBER:timeTaken}

Еще один совет: Logstash по умолчанию хранит все в виде строки в elasticsearch. Если вы хотите выполнять вычисления в кибане (например, среднее время, затраченное на все запросы,...), вам необходимо преобразовать поле в числовой тип (в настоящее время поддерживаются типы int и float, в соответствии с: https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html). Вы делаете это, используя такой шаблон:

%{NUMBER:timeTaken:int}
person markus    schedule 20.10.2015
comment
Отлично, я могу полностью разобрать журнал, как я хочу, с помощью пользовательского интерфейса отладки. Я расширил фильтр до этого %{TIME:time_stamp}\s%{IP:source_ip}\s%{WORD:cs_method}\s%{DATA:cs_uri_stem}\s%{DATA:cs_uri_query}\s%{DATA:source_port}\s%{DATA:username}\s%{IP:client_ip}\s%{DATA:client_browser}\s%{DATA:request_status}\s%{DATA:substatus}\s%{DATA:win32_status}\s, но столкнулся с одной проблемой. Я пытаюсь проанализировать полный журнал, включая поле time_taken, которое является последним полем в строке. Что бы я ни делал, отладчик говорит Нет совпадений, даже если в конце есть допустимый символ. - person pcort; 20.10.2015
comment
это строка журнала, которую я использую 2015-10-16 01:55:49 10.10.10.10 GET /note.txt querylinehere.asp 80 - 10.10.10.10 Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+5.1;+Trident/4.0) 404 0 2 2 - person pcort; 20.10.2015