【问题标题】:How to get log message in separated field whih logstash如何在使用logstash的单独字段中获取日志消息
【发布时间】:2015-06-17 13:59:00
【问题描述】:

我正在尝试从 logstash 以特定方式在 kibana 中获取我的日志,但我没有成功。

我会举例说明。然后,如果我的日志文件中有这一行:

2015-06-17 13:08:45      INFO    connectionpool  Starting new HTTPS connection (1): SSX9FSMULE.algolia.net

我想在 kibana 中有这些字段和值:

DateTime : 2015-06-17 13:08:45
LogType : INFO
ModuleName : connectionpool
Message :   connectionpool  Starting new HTTPS connection (1): SSX9FSMULE.algolia.net

日期时间字段并不重要,因为默认情况下 ES 包含时间戳

我试试这个代码:

if [type] == "mylog" {
    grok {
      match => { "message" => "%{MYLOGTIME:DateTime} %{LOGLEVEL:LogType} %{WORD:ModuleName}  %{GREEDYDATA:Message}" }
    }
  }

模式目录中的文件 mylog 包含此行:

MYLOGTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}

但它不起作用,我在 kibana 中没有得到上述所需字段之一,只有消息

2015-06-17 13:08:45      INFO    connectionpool  Starting new HTTPS connection (1): SSX9FSMULE.algolia.net

我试过这个:

if [type] == "autosuggest" {
    grok {
      match => { "message" => "%{GREEDYDATA:Message}" }
      add_field => [ "LogType", "%{LOGLEVEL}" ]
      add_field => [ "ModuleNAme", "%{WORD}" ]
    }
  }

并在 kibana 中得到了这个:

LogType : %{LOGELEVEL}
ModuleName : %{WORD}
Message :  2015-06-17 13:08:45      INFO    connectionpool  Starting new HTTPS connection (1): SSX9FSMULE.algolia.net

在标准 kibana 消息字段中,我有上面的消息:

 2015-06-17 13:08:45      INFO    connectionpool  Starting new HTTPS connection (1): SSX9FSMULE.algolia.net

虽然我只想将消息的最后一部分(模块名称之后的部分)作为消息。

我在谷歌上搜索了几个小时都没有成功

请有人解释如何使用 grok 获取我想要的消息部分,以及如何实现我在这里尝试做的事情。

谢谢

【问题讨论】:

    标签: logging elasticsearch logstash kibana


    【解决方案1】:

    您遇到的问题似乎与空格有关。如果你使用这样的模式:

    %{DATESTAMP:DateTime}\s+%{LOGLEVEL:LogType}\s+%{WORD:ModuleName}\s+%{GREEDYDATA:Message}
    

    它应该跳过那些多个空格。 \s+ 表示一个或多个空格(可以包括制表符)。

    【讨论】:

    • 是的 Alcanzar,我试过这个:if [type] == "mylog" { grok { match => { "message" => "%{MYLOGDATETIME:time}\s+%{LOGLEVEL:type}\s+%{WORD:module}\s+%{GREEDYDATA:msg}" } add_field => [ "DateTime", "%{time}" ] add_field => [ "LogType", "%{type}" ] add_field => [ "ModuleNAme", "%{module}" ] add_field => [ "Message", "%{msg}" ] } } 但它不起作用。现在我在 kibana 中有我的所有字段,没有 DateTime 字段(我不知道为什么)。但是所有这些字段(LogType、ModuleName、Message)都不包含任何数据。它们显示空线。
    • 另请注意,它们提供了一个 %{SPACE} 模式,即 \s*。
    【解决方案2】:

    最后我做到了,它成功了:

    if [type] == "mylog" {
        grok {
          match => { "message" => "%{MYLOGDATETIME:my_time}\s+ %{LOGLEVEL:my_type}\s+ %{WORD:my_module_name}\s+ %{GREEDYDATA:my_msg}" }
          add_field => [ "DateTime", "%{my_time}" ]
          add_field => [ "LogType", "%{my_type}" ]
          add_field => [ "ModuleNAme", "%{my_module_name}" ]
          add_field => [ "Message", "%{my_msg}" ]
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多