添加 Prune 过滤器和 KV 过滤器后 - 日志不会进入 Elastic 搜索
After adding Prune filter along with KV filter - logs are not going to Elastic search
我正在学习 ELK 并尝试为我的项目做一个 POC。我正在为我的项目中的示例集成日志应用 KV 过滤器,结果我可以看到很多额外的字段,所以我尝试应用修剪过滤器并将某些字段列入白名单。我可以看到在 logstash 服务器中打印的日志,但日志不会进行弹性搜索。如果我删除过滤器,它将进行弹性搜索。请指教如何进一步调试此问题。
filter {
kv {
field_split => "{},?\[\]"
transform_key => "capitalize"
transform_value => "capitalize"
trim_key => "\s"
trim_value => "\s"
include_brackets => false
}
prune
{
whitelist_names => [ "App_version", "Correlation_id", "Env", "Flow_name", "host", "Instance_id", "log_level","log_thread", "log_timestamp", "message", "patient_id", "status_code", "type", "detail"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "mule-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
stdout { codec => rubydebug }
}
我还需要两个建议,
我也在尝试在初始日志中使用 grok 过滤器,并尝试从示例日志中获取日志级别字段(时间和日志类型),并将剩余的日志发送到 KV 过滤器。有没有参考,请分享。这就是我尝试过的。但越来越像_grokparsefailure。我已将 msgbody 传递给带有 source 选项的 kv 过滤器。
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
overwrite => [ "msgbody" ]
}
我在示例日志中有消息字段,如下所示。当数据转到 Kibana 时,我可以看到两个消息字段标记,一个是完整日志,另一个是正确消息(突出显示)。突变对这种情况有效吗?有什么办法可以将完整的日志名称更改为其他名称吗??
[2020-02-10 11:20:07.172] INFO Mule.api [[MuleRuntime].cpuLight.04:
[main-api-test].api-main.CPU_LITE @256c5cf5:
[main-api-test].main-api-main/processors/0/processors/0.CPU_LITE
@378f34b0]: event:00000003 {app_name=main-api-main, app_version=v1,
env=Test, timestamp=2020-02-10T11:20:07.172Z,
log={correlation_id=00000003, patient_id=12345678,
instance_id=hospital, message=Start of System API,
flow_name=main-api-main}}
p运行e 过滤错误
您的 prune
过滤器在 whitelist_names
列表中没有 @timestamp
字段,您的输出是基于日期的 (%{+YYYY.MM.dd}
),logstash 需要 @timestamp
输出中的字段以提取日期。
我已经 运行 你的管道和你的示例消息并且它按预期工作,使用 prune
过滤器将消息发送到 elasticsearch,但它存储在名为 [= 的索引中18=] 没有任何日期时间字段。
没有 prune
过滤器,您的消息使用 logstash 收到事件的时间作为 @timestamp
,因为您没有任何日期过滤器来更改它。
如果您使用日期时间字段 @timestamp
为索引 mule-*
创建了索引模式,您将不会在 Kibana 上看到索引上没有相同日期时间的任何文档场.
grok 错误
你的 grok 是错误的,你需要转义时间戳周围的方括号。 Kibana 有一个 grok 调试器,您可以在其中尝试您的模式。
下面的 grok 有效,将你的 kv 移动到 grok 之后的 运行,并以 msgbody
作为源。
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
overwrite => [ "msgbody" ]
}
kv {
source => "msgbody"
field_split => "{},?\[\]"
transform_key => "capitalize"
transform_value => "capitalize"
trim_key => "\s"
trim_value => "\s"
include_brackets => false
}
只是 运行 它只输出到标准输出以查看您需要更改 prune
过滤器的过滤器。
重复的消息字段
如果您将 kv
过滤器放在 grok
之后,您将不会重复 message
字段,因为您的 kv
正在大写您的字段,您将以包含完整日志的 message
字段和包含内部消息的 Message
字段,logstash 字段区分大小写。
但是您可以使用 mutate
过滤器重命名任何字段。
mutate {
rename => ["message", "fullLogMessage"]
}
我正在学习 ELK 并尝试为我的项目做一个 POC。我正在为我的项目中的示例集成日志应用 KV 过滤器,结果我可以看到很多额外的字段,所以我尝试应用修剪过滤器并将某些字段列入白名单。我可以看到在 logstash 服务器中打印的日志,但日志不会进行弹性搜索。如果我删除过滤器,它将进行弹性搜索。请指教如何进一步调试此问题。
filter {
kv {
field_split => "{},?\[\]"
transform_key => "capitalize"
transform_value => "capitalize"
trim_key => "\s"
trim_value => "\s"
include_brackets => false
}
prune
{
whitelist_names => [ "App_version", "Correlation_id", "Env", "Flow_name", "host", "Instance_id", "log_level","log_thread", "log_timestamp", "message", "patient_id", "status_code", "type", "detail"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "mule-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
stdout { codec => rubydebug }
}
我还需要两个建议,
我也在尝试在初始日志中使用 grok 过滤器,并尝试从示例日志中获取日志级别字段(时间和日志类型),并将剩余的日志发送到 KV 过滤器。有没有参考,请分享。这就是我尝试过的。但越来越像_grokparsefailure。我已将 msgbody 传递给带有 source 选项的 kv 过滤器。
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
overwrite => [ "msgbody" ]
}
我在示例日志中有消息字段,如下所示。当数据转到 Kibana 时,我可以看到两个消息字段标记,一个是完整日志,另一个是正确消息(突出显示)。突变对这种情况有效吗?有什么办法可以将完整的日志名称更改为其他名称吗??
[2020-02-10 11:20:07.172] INFO Mule.api [[MuleRuntime].cpuLight.04: [main-api-test].api-main.CPU_LITE @256c5cf5: [main-api-test].main-api-main/processors/0/processors/0.CPU_LITE @378f34b0]: event:00000003 {app_name=main-api-main, app_version=v1, env=Test, timestamp=2020-02-10T11:20:07.172Z, log={correlation_id=00000003, patient_id=12345678, instance_id=hospital, message=Start of System API, flow_name=main-api-main}}
p运行e 过滤错误
您的 prune
过滤器在 whitelist_names
列表中没有 @timestamp
字段,您的输出是基于日期的 (%{+YYYY.MM.dd}
),logstash 需要 @timestamp
输出中的字段以提取日期。
我已经 运行 你的管道和你的示例消息并且它按预期工作,使用 prune
过滤器将消息发送到 elasticsearch,但它存储在名为 [= 的索引中18=] 没有任何日期时间字段。
没有 prune
过滤器,您的消息使用 logstash 收到事件的时间作为 @timestamp
,因为您没有任何日期过滤器来更改它。
如果您使用日期时间字段 @timestamp
为索引 mule-*
创建了索引模式,您将不会在 Kibana 上看到索引上没有相同日期时间的任何文档场.
grok 错误
你的 grok 是错误的,你需要转义时间戳周围的方括号。 Kibana 有一个 grok 调试器,您可以在其中尝试您的模式。
下面的 grok 有效,将你的 kv 移动到 grok 之后的 运行,并以 msgbody
作为源。
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
overwrite => [ "msgbody" ]
}
kv {
source => "msgbody"
field_split => "{},?\[\]"
transform_key => "capitalize"
transform_value => "capitalize"
trim_key => "\s"
trim_value => "\s"
include_brackets => false
}
只是 运行 它只输出到标准输出以查看您需要更改 prune
过滤器的过滤器。
重复的消息字段
如果您将 kv
过滤器放在 grok
之后,您将不会重复 message
字段,因为您的 kv
正在大写您的字段,您将以包含完整日志的 message
字段和包含内部消息的 Message
字段,logstash 字段区分大小写。
但是您可以使用 mutate
过滤器重命名任何字段。
mutate {
rename => ["message", "fullLogMessage"]
}