2015-10-20 56 views
0

我正在運行ELK堆棧,並將所有的Windows日誌從nxlog傳遞給它,並且特別針對IIS日誌。在nxlog我在nxlog.conf文件運行此nxlog和elasticsearch解析問題

<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"]}

我希望能夠解析此消息,並獲取所有相關數據。似乎應該可以通過nxlog解析iis日誌,然後將json信息傳遞給elasticsearch。但我不確定這是我應該在nxlog方面還是l​​ogstash方面做的事情。我看過的所有內容都使用相同的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

RESPONSE#2: @pcport我想我看到你的問題。您正在使用的數據模式,這是在使用非貪婪的正則表達式 - 它被定義爲這樣的:

DATA .*? 

您可以告訴你要匹配,直到結束線的REG-expparser (只需在你的模式結尾放一個$)或者最好通過使用NUMBER模式而不是DATA模式來使你的grok模式更具體。默認情況下,把所有東西在elasticsearch字符串Logstash:試試這個,例如:

%{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} 

一個額外的提示。如果你想用kibana進行計算(例如,所有請求的平均時間,...),則需要將該字段轉換爲數字類型(當前支持的是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 +(compatible; + MSIE + 8.0; + Windows + NT + 5.1; +三叉戟/ 4.0)404 0 2 2' – pcort

+0

@pcport答案更新,希望它可以幫助... – markus