【问题标题】:nxlog and elasticsearch parsing issuenxlog 和 elasticsearch 解析问题
【发布时间】: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 日志来查看大量数据。

【问题讨论】:

    标签: windows iis logstash nxlog


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多