nxlog 和 elasticsearch 解析问题

nxlog and elasticsearch parsing issue

我是 运行 一个 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 日志。

您可以将 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 使 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}