2

我有两个相关的问题。首先是如何最好地了解具有“杂乱”间距等的日志,第二个是我将单独询问的,是如何处理具有任意属性值对的日志。(请参阅:logstash grok 过滤器,用于具有任意属性值对的日志

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

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} 这么多。这向我表明,我并没有真正以最好的方式做到这一点。我应该为十六进制 ID 创建更具体的模式吗?我认为我需要 loglevel 和 logtype 之间的 %{SPACE} ,因为日志中的 INFO 和 METERING 之间有额外的空间,但这也让人感觉很笨拙。

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

显然,我刚刚开始使用 ELK 和 grok,因此也感谢指向有用资源的指针。

4

2 回答 2

3

您可以使用现有的模式来代替NOTSPACE,它是UUID. 此外,当只有一个空格时,无需使用该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

格罗模式:

%{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"
    ]
  ]
}
于 2015-08-21T05:11:12.093 回答
0

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

要删除字段,您可以使用 mutate 插件,有一种方法称为“remove_field”-> https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-变异删除字段

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

于 2016-09-29T07:51:06.387 回答