我正在运行一个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"]}
我希望能够解析此消息,并获取所有相关数据。看起来应该可以通过nxlog解析iis日志,然后将json信息传递给elasticsearch。但是我不确定这是否应该在nxlog端或logstash端进行。我所看到的一切都是使用相同的w3c扩展,但是我没有大量数据可以使用nxlog和logstash来解析IIS日志。
答案 0 :(得分:1)
您可以在logstash配置中添加grok过滤器。在grok过滤器中,您基本上可以从nxlog配置镜像您的Fields定义。你基本上可以使用这样的模式:
%{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你想要匹配到行尾(只需在你的模式的末尾添加一个$),或者最好通过使用NUMBER模式来改变你的grok模式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中的字符串。如果你想在kibana中进行计算(例如,所有请求的平均时间,......),你需要将字段转换为数字类型(目前支持的是int和float,根据:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html)。您可以使用以下模式执行此操作:
%{NUMBER:timeTaken:int}