我正在运行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>
我没有运行任何解析日志库,当它们出现在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 31r","@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日志。
您可以在您的logstash配置中添加grok过滤器。在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您正在尝试匹配直到行尾(只需在模式末尾放置一个$),或者最好通过使用NUMBER模式而不是DATA模式使您的grok模式更具体。例如:
%{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中进行计算(例如,所有请求所花费的平均时间,…),你需要将字段转换为数字类型(根据:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html,目前支持int和float)。您可以使用这样的模式:
%{NUMBER:timeTaken:int}