nxlog 和 elasticsearch 解析问题

Posted

技术标签:

【中文标题】nxlog 和 elasticsearch 解析问题【英文标题】:nxlog and elasticsearch parsing issue 【发布时间】:2015-10-20 00:27:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以在您的 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 模式使您的 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

【讨论】:

太棒了,我能够通过调试 UI 完全解析日志。我将过滤器扩展到此%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:username\s%IP:client_ip\s%DATA:client_browser\s%DATA:request_status\s%DATA:substatus\s%DATA:win32_status\s,但遇到了一个问题。我正在尝试解析包含 time_taken 字段的完整日志,该字段是字符串中的最后一个字段。无论我做什么,调试器都会说“不匹配”,即使最后有一个有效字符。 这是我正在使用的日志行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;+Trident/4.0) 404 0 2 2

以上是关于nxlog 和 elasticsearch 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

nxlog 的正则表达式

logstash--使用ngxlog收集windows日志

ELk 几篇好的文章

ElasticSearch 日期赋值

NXLog 传送 Windows 事件和 SeverityValue

带有 HTTPS 的 NXLog:如何配置 SSL 和证书?