使用正则表达式过滤与 json

Filtering with regex vs json

在过滤日志时,Logstash 可能会使用grok 来解​​析接收到的日志文件(假设是Nginx 日志)。使用 grok 进行解析需要您正确设置字段类型 - 例如,%{HTTPDATE:timestamp}.

但是,如果 Nginx 开始以 JSON 格式登录,那么 Logstash 会做很少的处理。它只是创建索引,并输出到 Elasticseach。这让我相信只有 Elasticsearch 从 "way" 它接收索引中受益。

与 JSON 相比,Elasticseatch 在使用 Regex 处理的索引数据方面有什么优势吗?例如,它会影响查询时间吗?

对于 elasticsearch,无论你如何解析消息,它都没有关于它的信息,你只需要发送一个 JSON 文档,其中包含你想要存储和搜索的字段到您的索引映射。

但是,您如何解析消息对 Logstash 很重要,因为它会直接影响性能。

例如,考虑以下消息:

2020-04-17 08:10:50,123 [26] INFO ApplicationName - LogMessage From The Application

如果您希望能够搜索此邮件的每个部分并对其应用过滤器,您需要将其解析为字段。

timestamp: 2020-04-17 08:10:50,123
thread: 26
loglevel: INFO
application: ApplicationName
logmessage: LogMessage From The Application

要解析此消息,您可以使用不同的过滤器,其中之一是 grok,它使用正则表达式,但如果您的消息始终采用相同的格式,您可以使用另一个过滤器,例如 dissect, 在这种情况下两者将实现相同的目的,但是 grok 使用正则表达式匹配字段, dissect 只是位置,这在 CPU 使用时有很大的不同每秒发生大量事件。

现在考虑您有相同的消息,但采用 JSON 格式。

{ "timestamp":"2020-04-17 08:10:50,123", "thread":26, "loglevel":"INFO", "application":"ApplicationName","logmessage":"LogMessage From The Application" } 

logstash 解析此消息更容易、更快速,您可以在 input 中使用 json 编解码器进行解析,或者您可以在过滤器中使用 json 过滤器块。

如果您可以控制日志消息的创建方式,请选择不需要使用的内容 grok