用于自定义日志的logstash grok过滤器

时间:2015-08-07 18:07:40

标签: logstash logstash-grok elastic-stack

我有两个相关的问题。首先是如何最好地记录具有"凌乱"间距等等,我将分别提出的第二个问题是如何处理具有任意属性 - 值对的日志。 (见:logstash grok filter for logs with arbitrary attribute-value pairs

所以对于第一个问题,我有一个如下所示的日志行:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92

使用http://grokdebug.herokuapp.com/我最终能够提出以下适用于此行的grok模式:

%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}

使用以下配置文件:

input {
        file {
                path => "/home/robyn/testlogs/trimmed_logs.txt"
                start_position => beginning
                sincedb_path => "/dev/null" # for testing; allows reparsing
        }
}
filter {
        grok {
                match => {"message" => "%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}" }
        }
}
output {
        file {
                path => "/home/robyn/filteredlogs/trimmed_logs.out.txt"
        }
}

我得到以下输出:

{"message":"14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92","@version":"1","@timestamp":"2015-08-07 T17:55:16.529Z","host":"hlt-dev","path":"/home/robyn/testlogs/trimmed_logs.txt","timestamp":"14:46:16.603","http":"[http-nio-8080-exec-4]","loglevel":"INFO","logtype":"METERING","msg":"93e6dd5e-c009-46b3-b9eb-f753ee3b889a","action":"CREATE_JOB","job":"a820018e-7ad7-481a-97b0-bd705c3280ad","data":"71b1652e-16c8-4b33-9a57-f5fcb3d5de92"}

这几乎是我想要的,但我觉得这是一个非常糟糕的模式,特别是需要使用%{SPACE}和%{NOSPACE}这么多。这告诉我,我并没有以最好的方式做到这一点。我应该为hex id创建更具体的模式吗?我认为我需要loglevel和logtype之间的%{SPACE},因为日志中INFO和METERING之间有额外的空间,但这也感觉很糟糕。

另外,如何获取日志的时间戳来替换@timestamp,这似乎是记录日志的时间,这是我们不想要/不需要的。

显然,我刚刚开始使用ELK和grok,所以我们也非常感谢有用资源的指示。

2 个答案:

答案 0 :(得分:1)

您可以使用现有模式代替NOTSPACEUUID。此外,如果只有一个空格,则无需使用SPACE模式,您可以将其删除。我也是为了捕获USERNAME字段而使用http模式(可能是错误命名的)。

所以它会像这样,你只有一个SPACE模式来捕获多个空格。

示例日志行:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92

Grok模式:

%{TIME:timestamp} \[%{USERNAME:http}\] %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{UUID:msg} %{WORD:action} job=%{UUID:job} data=%{UUID:data}

Grok将吐出来:

{
  "timestamp": [
    [
      "14:46:16.603"
    ]
  ],
  "HOUR": [
    [
      "14"
    ]
  ],
  "MINUTE": [
    [
      "46"
    ]
  ],
  "SECOND": [
    [
      "16.603"
    ]
  ],
  "http": [
    [
      "http-nio-8080-exec-4"
    ]
  ],
  "loglevel": [
    [
      "INFO"
    ]
  ],
  "SPACE": [
    [
      "  "
    ]
  ],
  "logtype": [
    [
      "METERING"
    ]
  ],
  "msg": [
    [
      "93e6dd5e-c009-46b3-b9eb-f753ee3b889a"
    ]
  ],
  "action": [
    [
      "CREATE_JOB"
    ]
  ],
  "job": [
    [
      "a820018e-7ad7-481a-97b0-bd705c3280ad"
    ]
  ],
  "data": [
    [
      "71b1652e-16c8-4b33-9a57-f5fcb3d5de92"
    ]
  ]
}

答案 1 :(得分:0)

还可以使用\ s *代替SPACE模式。

对于删除字段,您可以使用mutate插件,有一个名为" remove_field" - > https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-remove_field

如果删除此字段,则必须在kibana中添加新索引。因为如果没有其他选择,kibana会使用@timestamp字段对事件进行排序。