0

我正在运行一个 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 日志来查看大量数据。

4

1 回答 1

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 您正在尝试匹配直到行尾(只需在模式末尾放一个 $),或者最好使用 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 中进行计算(例如,所有请求的平均时间,...),您需要将字段转换为数字类型(目前支持的是 int 和 float,根据:https://www.elastic。 co/guide/en/logstash/current/plugins-filters-grok.html)。您可以使用如下模式执行此操作:

%{NUMBER:timeTaken:int}
于 2015-10-20T08:21:46.067 回答