如何提取字段的一部分并将其存储到 logstash 过滤器中的另一个字段中?
how to extract a portion of a field and store it into another field in logstash filter?
我有系统日志文件。我正在使用 logstash syslog 插件过滤器来处理这些日志。我在 syslog_message
字段中收到这样的消息:
syslog_message:[cdp/interface.ERR] - {- -} Error writing CDP frame on system. Link is down
但我想要一个新字段,它应该只包含 .ERR 之前的部分,即 "cdp/interface"。这部分各不相同,我不知道会出现多少种。
所以我想要一个新字段并想将该部分存储到该字段,以便我可以在 kibana 中绘制这些术语的计数。
当前 logstash 配置:
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
target => "syslog_timestamp"
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
按照@Val 的建议将新的 grok 添加到配置文件后
grok {
match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\] %{GREEDYDATA:syslog_message}" }
}
对于某些输入,会发生 grokparsefailure。
它失败的一些行是:
syslog_message: [hald.INFO]: Support query handler called
syslog_message:[mgmtd.INFO]: Finished database commit
如有任何帮助,我们将不胜感激。
谢谢
您可以在主 grok
过滤器中再添加一个模式,或者为 syslog_message
字段添加另一个 grok
过滤器
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
# ====> add this <====
grok {
match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\]:? %{GREEDYDATA:syslog_message}" }
}
date {
target => "syslog_timestamp"
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
因此,您会得到两个额外的字段,即:
syslog_type: cdp/interface
syslog_level: ERR
和syslog_message
只会包含这个- {- -} Error writing CDP frame on system. Link is down
我有系统日志文件。我正在使用 logstash syslog 插件过滤器来处理这些日志。我在 syslog_message
字段中收到这样的消息:
syslog_message:[cdp/interface.ERR] - {- -} Error writing CDP frame on system. Link is down
但我想要一个新字段,它应该只包含 .ERR 之前的部分,即 "cdp/interface"。这部分各不相同,我不知道会出现多少种。 所以我想要一个新字段并想将该部分存储到该字段,以便我可以在 kibana 中绘制这些术语的计数。
当前 logstash 配置:
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
target => "syslog_timestamp"
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
按照@Val 的建议将新的 grok 添加到配置文件后
grok {
match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\] %{GREEDYDATA:syslog_message}" }
}
对于某些输入,会发生 grokparsefailure。
它失败的一些行是:
syslog_message: [hald.INFO]: Support query handler called
syslog_message:[mgmtd.INFO]: Finished database commit
如有任何帮助,我们将不胜感激。 谢谢
您可以在主 grok
过滤器中再添加一个模式,或者为 syslog_message
字段添加另一个 grok
过滤器
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
# ====> add this <====
grok {
match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\]:? %{GREEDYDATA:syslog_message}" }
}
date {
target => "syslog_timestamp"
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
因此,您会得到两个额外的字段,即:
syslog_type: cdp/interface
syslog_level: ERR
和syslog_message
只会包含这个- {- -} Error writing CDP frame on system. Link is down