【问题标题】:How to use IF ELSE condition in grok pattern in logstash如何在logstash的grok模式中使用IF ELSE条件
【发布时间】:2019-01-16 12:07:47
【问题描述】:

我将 Web 和 API 日志结合在一起,我想将其单独保存在 elasticsearch 中。所以我想写一个模式,如果请求是针对 API 的,那么如果过去应该执行,请求是 web,那么应该执行日志的其他部分。

以下是一些 Web 和 API 日志。

00:06:27,778 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.777 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() started to get widget details.
00:06:27,783 INFO  [stdout] (ajp--0.0.0.0-8009-38) ---> HTTP GET http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true
00:06:27,817 INFO  [stdout] (ajp--0.0.0.0-8009-38) <--- HTTP 200 http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true (29ms)
00:06:27,822 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.822 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() finished.
00:06:27,899 INFO  [stdout] (ajp--0.0.0.0-8009-40) 00:06:27.899 [ajp--0.0.0.0-8009-40] INFO  c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController

我试图写条件,但它不起作用。它仅适用于线程名称。在线程之后,我有多种类型的日志,因此如果条件不存在,则无法写入。

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)

有人可以给我建议吗?

【问题讨论】:

    标签: logstash elastic-stack logstash-grok logstash-configuration


    【解决方案1】:

    您不需要使用if/else 条件来执行此操作,您可以使用多种模式,一种将匹配 API 日志行,另一种将匹配 WEB 日志行。

    对于 API 日志行,您可以使用以下模式:

    (?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}(?:%{DATA})%{SPACE}\[%{DATA}\]%{SPACE}%{WORD}%{SPACE}%{GREEDYDATA:MSG}

    你的回报将是这样的:

    {
    "MSG": "c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController",
    "CREATED_ON": "00:06:27,899",
    "LEVEL": "INFO",
    "THREAD": "ajp--0.0.0.0-8009-40"
    }
    

    对于网络行,您可以使用以下模式:

    (?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}%{DATA}%{WORD:PROTOCOL}%{SPACE}%{WORD:MethodOrStatus}%{SPACE}%{GREEDYDATA:ENDPOINT}

    结果将是:

    {
    "CREATED_ON": "00:06:27,783",
    "PROTOCOL": "HTTP",
    "ENDPOINT": "http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true",
    "LEVEL": "INFO",
    "THREAD": "ajp--0.0.0.0-8009-38",
    "MethodOrStatus": "GET"
    }
    

    要在 grok 中使用多种模式,只需这样做:

    grok {
      match => ["message", "pattern1", "pattern2"]
    }
    

    或者您可以将您的模式保存到文件中并使用patterns_dir 指向该文件的目录。

    如果您仍想使用条件,只需检查消息中的任何内容,例如:

    if "HTTP" in [message] { 
     grok { your grok for the web messages }
    } else {
     grok { your grok for the api messages }
    }
    

    【讨论】:

    • 感谢您的帮助,我试过了,但它没有给我任何错误,也没有在 elasticsearch 中创建任何索引。我无法在此处发布我的配置文件,因此我将其发布到下面的答案部分。请确认是否正确。
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多