繁体   English   中英

通过 grok 过滤器(logstash)解析日志数据

[英]Parsing log data throught grok filter (logstash)

我对 ELK 很陌生,我正在尝试通过 logstash 解析我的日志。 日志由 filebeat 发送。

日志看起来像:

2019.12.02 16:21:54.330536 [ 1 ] {} <Information> Application: starting up
2020.03.21 13:14:54.941405 [ 28 ] {xxx23xx-xxx23xx-4f0e-a3c6-rge3gu1} <Debug> executeQuery: (from [::ffff:192.0.0.0]:9999) blahblahblah
2020.03.21 13:14:54.941469 [ 28 ] {xxx23xx-xxx23xx-4f0e-a3c6-rge3gu0} <Error> executeQuery: Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 1

我的默认logstash配置是:

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

在我的日志示例中,我提取如下字段:时间戳代码 pipelineId logLevel 程序消息。

但是我的 grok 模式有几个问题。 首先,日志上的时间戳与经典时间戳完全不同。 我怎样才能得到它的认可? 当 {} 可以为空或不为空时,我也遇到了问题。 你能给我一些关于什么应该是正确的grok模式的建议吗?

此外,在 Kibana 中,我有很多信息,例如主机名、操作系统详细信息、代理详细信息、来源等。我读过这些字段是 ES 元数据,因此无法删除它们。 我发现它有很多信息,有没有办法“隐藏”这些?

格罗模式

在下面的屏幕截图中,您可以看到我为您的示例日志构建的模式(在Grok Debugger中): 在此处输入图像描述

这是你要找的结果吗?

Logstash 配置

# logstash.conf
…
filter {
    grok {
        patterns_dir => ["./patterns"]
        match => {
            "message" => "%{CUSTOM_DATE:timestamp}\s\[\s%{BASE10NUM:code}\s\]\s\{%{GREEDYDATA:pipeline_id}\}\s\<%{GREEDYDATA:log_level}\>\s%{GREEDYDATA:program_message}"
        }
    }
}
…

自定义图案

如您所见,我告诉 grok 在patterns目录中查找我的自定义模式,我将其放在与我的logstash.conf文件相同的位置。 在此目录中,我创建了包含以下内容的custom.txt文件:

# patterns/custom.txt
CUSTOM_DATE (?>\d\d){1,2}\.(?:0?[1-9]|1[0-2])\.(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])\s(?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])

这么长的图案不是我自己写的。 我从这一行开始:

CUSTOM_DATE %{YEAR}\.%{MONTHNUM}\.%{MONTHDAY}\s%{TIME}

然后,我用相应的正则表达式替换了每个预定义的模式(一个接一个,直接在 Grok 调试器中)。 您可以在应用程序中使用%{YEAR}\.%{MONTHNUM}\.%{MONTHDAY}\s%{TIME} ,但 Grok 调试器界面将分别打印每个部分。

是否要删除空字段?

如果pipeline_id字段为空,我不知道你想做什么。 如果要完全删除它,可以尝试将以下行添加到配置中:

# logstash.conf
…
filter {
    grok {
        …
    }
    if [pipeline_id] == "" {
        mutate {
            remove_field => ["pipeline_id"]
        }
    }
}
…

有用的资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM