2015-10-20 4 views
0

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

<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 или на стороне журнала. Все, на что я смотрел, использует одно и то же расширение w3c, но нет тонны данных, которые я могу посмотреть на использование как nxlog, так и logstash для анализа журналов IIS.

ответ

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} 
+0

Удивительно, я могу полностью проанализировать журнал, как я хочу, через интерфейс отладки. Я расширил фильтр до этого '% {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: имя пользователя} \ s% {IP: client_ip} \ s% {DATA: client_browser} \ s% {DATA: request_status} \ s% {DATA: подсостояния} \ s% {DATA: win32_status } \ s', но я столкнулся с одной проблемой. Я пытаюсь разобрать полный журнал, включая поле time_taken, которое является последним полем в строке. Независимо от того, что я делаю, отладчик говорит «Нет совпадений», хотя в конце есть действительный символ. – pcort

+0

это строка журнала, в которой я использую '2015-10-16 01:55:49 10.10.10.10 GET /note.txt querylinehere.asp 80 - 10.10.10.10 Mozilla/4.0 + (совместимый; + MSIE + 8.0; + Windows + NT + 5.1; + Trident/4.0) 404 0 2 2' – pcort

+0

@pcport ответ обновлен, надеюсь, что это поможет ... – markus