elasticsearch,logstash,Logging,elasticsearch,Logstash" /> elasticsearch,logstash,Logging,elasticsearch,Logstash" />

Logging 如何使用Logstash和Elasticsearch处理有时也可能没有值的数字?

Logging 如何使用Logstash和Elasticsearch处理有时也可能没有值的数字?,logging,elasticsearch,logstash,Logging,elasticsearch,Logstash,我试图用Logstash解析一个类似Apache的日志文件,其中包含的数字有时表示为-,而不是0,例如Apache中的%b格式字符串可以是: %b:响应的大小(字节),不包括HTTP头。在CLF格式中,即当没有发送字节时,为“-”而不是0 (来自) 在Logstash中,我创建了如下模式:NIL_NUMBER(%{NUMBER})|(),Logstash成功解析了我的所有日志 但是,当我想在Elasticsearch中插入这些日志文件的内容时,如果我先插入一个实数,Elasticsearch

我试图用Logstash解析一个类似Apache的日志文件,其中包含的数字有时表示为
-
,而不是
0
,例如Apache中的
%b
格式字符串可以是:

  • %b
    :响应的大小(字节),不包括HTTP头。在CLF格式中,即当没有发送字节时,为“-”而不是0
(来自)

在Logstash中,我创建了如下模式:
NIL_NUMBER(%{NUMBER})|(
),Logstash成功解析了我的所有日志

但是,当我想在Elasticsearch中插入这些日志文件的内容时,如果我先插入一个实数,Elasticsearch会推断此字段是一个类似整数的字段,然后插入此
-
值失败,并显示以下消息:

MapperParsingException[failed to parse [value]];
  nested: NumberFormatException[For input string: "-"]; 
(我可以在Elasticsearch的日志中找到)

如果在将所有字段输入Elasticsearch之前将其转换为字符串,看起来不会出现此错误,但这不是理想的解决方案,因为我正在丢失值的类型

在插入之前将此值转换为
null
0
将是目前我能看到的最佳解决方案,但还有其他解决方案吗?
在这种情况下,您将如何以通用方式(在这种情况下,我有“很多”字段)和快速方式进行此转换?

COMMONAPACHELOG模式向您展示了如何解决此问题:

(?:%{NUMBER:bytes}|-)
要根据要求更详细地解释这一点,请执行以下操作:

首先,让我们为模式中的字节字段提供一些上下文:

foo (%{NUMBER})|(-) bar
为了真正了解中的情况,我将把
%{NUMBER}
扩展到真正的regxp中。因此,它变成:

foo ((?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))|(-) bar
除此之外,这些也匹配:

"foo 123 spam"
"spam - bar"
这是因为您的“|”已解组

这就是我试图用我的模式来补救的。看起来我应该写:

foo (%{NUMBER:bytes}|-) bar
(首字母“?:”不需要)

它与您的不同之处在于更改了排列的位置,将“数字或-”组成一个组,而不是两个组


此模式正确地处理了上面使用的4个样本。

您是否愿意解释一下它与我在问题中所写的模式有何不同,以及这对我有何帮助?
foo (%{NUMBER:bytes}|-) bar