Logstash 不处理 docker 容器中 grok 模式中的零长度正则表达式
Logstash does not process zero-length regexs in grok pattern in docker container
我必须在 Grok 模式中使用零长度正则表达式。
我已经在 online grok constructor 中测试过了。有效。
但同样的模式在我的 docker 容器中不起作用。我在 Logstash v6.6.1、v7.3.0 中测试过。
我还尝试了不同的正则表达式:.{0}, ^$
.
日志示例:
17:16:09,691 信息 blablabla
Logstash 模式
%{TIME:time} %{LOGLEVEL:severity} %{GREEDYDATA:message}(?<zero_length_field>())
Grok 构造函数结果。预计
MATCHED
time 17:16:09,691
severity INFO
message blablabla
zero_length_field
Stdout 生成 docker 容器
"severity" => "info",
"time" => 17:16:09,691
"version" => "0.3.0",
"message" => " blablabla",
您需要将keep_empty_captures
设置为true
,因为by default,它设置为false
:
keep_empty_captures
- Value type is boolean
- Default value is false
If true
, keep empty captures as event fields.
所以,使用
grok {
keep_empty_captures => true
match => { "message" => "%{TIME:time} %{LOGLEVEL:severity} %{GREEDYDATA:message}(?<zero_length_field>)"}
}
我必须在 Grok 模式中使用零长度正则表达式。
我已经在 online grok constructor 中测试过了。有效。
但同样的模式在我的 docker 容器中不起作用。我在 Logstash v6.6.1、v7.3.0 中测试过。
我还尝试了不同的正则表达式:.{0}, ^$
.
日志示例:
17:16:09,691 信息 blablabla
Logstash 模式
%{TIME:time} %{LOGLEVEL:severity} %{GREEDYDATA:message}(?<zero_length_field>())
Grok 构造函数结果。预计
MATCHED
time 17:16:09,691
severity INFO
message blablabla
zero_length_field
Stdout 生成 docker 容器
"severity" => "info",
"time" => 17:16:09,691
"version" => "0.3.0",
"message" => " blablabla",
您需要将keep_empty_captures
设置为true
,因为by default,它设置为false
:
keep_empty_captures
- Value type is boolean
- Default value isfalse
Iftrue
, keep empty captures as event fields.
所以,使用
grok {
keep_empty_captures => true
match => { "message" => "%{TIME:time} %{LOGLEVEL:severity} %{GREEDYDATA:message}(?<zero_length_field>)"}
}