grok 语句中的 logstash if 语句
logstash if statement within grok statement
我正在创建一个 logstash grok 过滤器以从备份服务器中提取事件,我希望能够测试一个字段的模式,如果它与模式匹配,进一步处理该字段并提取附加信息。
为此,我在 grok
语句本身中嵌入了一个 if
语句。这导致测试在 if
之后立即失败并显示 Error: Expected one of #, =>
。
这是过滤语句:
filter {
grok {
patterns_dir => "./patterns"
# NetWorker logfiles have some unusual fields that include undocumented engineering codes and what not
# time is in 12h format (ugh) so custom patterns need to be used.
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
# attempt to find completed savesets and pull that info from the daemon_message field
if [daemon_message] =~ /done\ saving\ to\ pool/ {
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
}
}
date {
# This is requred to set the time from the logline to the timestamp and not have it create it's own.
# Note the use of the trailing 'a' to denote AM or PM.
match => ["timestamp", "MM/dd/yyyy HH:mm:ss a"]
}
}
此块失败并显示以下内容:
$ /opt/logstash/bin/logstash -f ./networker_daemonlog.conf --configtest
Error: Expected one of #, => at line 12, column 12 (byte 929) after # Basic dumb simple networker daemon log grok filter for the NetWorker daemon.log
# no smarts to this and not really pulling any useful info from the files (yet)
filter {
grok {
... lines deleted ...
# attempt to find completed savesets and pull that info from the daemon_message field
if
我是 logstash 的新手,我意识到在 grok
语句中使用条件可能是不可能的,但我更喜欢以这种方式进行条件处理而不是额外的 match
行因为这会使 daemon_message 字段完好无损地用于其他用途,同时提取我想要的数据。
ETA:我还应该指出,完全删除 if
语句允许配置测试通过并允许过滤器解析日志。
提前致谢...
条件超出了过滤器,所以类似于:
if [field] == "value" {
grok {
...
}
]
是正确的。在你的情况下,做第一个 grok,然后测试到 运行 第二个,即:
grok {
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
}
if [daemon_message] =~ /done\ saving\ to\ pool/ {
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
}
这实际上是 运行为一条匹配的记录设置了两个正则表达式。由于 grok 只会在正则表达式匹配时创建字段,您可以这样做:
grok {
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
}
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
您必须衡量实际日志文件的性能,因为这会 运行 更少的正则表达式,但第二个更复杂。
如果您真的想疯狂,可以使用 break_on_match 功能在一个 grok{} 中完成所有这些操作。
我正在创建一个 logstash grok 过滤器以从备份服务器中提取事件,我希望能够测试一个字段的模式,如果它与模式匹配,进一步处理该字段并提取附加信息。
为此,我在 grok
语句本身中嵌入了一个 if
语句。这导致测试在 if
之后立即失败并显示 Error: Expected one of #, =>
。
这是过滤语句:
filter {
grok {
patterns_dir => "./patterns"
# NetWorker logfiles have some unusual fields that include undocumented engineering codes and what not
# time is in 12h format (ugh) so custom patterns need to be used.
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
# attempt to find completed savesets and pull that info from the daemon_message field
if [daemon_message] =~ /done\ saving\ to\ pool/ {
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
}
}
date {
# This is requred to set the time from the logline to the timestamp and not have it create it's own.
# Note the use of the trailing 'a' to denote AM or PM.
match => ["timestamp", "MM/dd/yyyy HH:mm:ss a"]
}
}
此块失败并显示以下内容:
$ /opt/logstash/bin/logstash -f ./networker_daemonlog.conf --configtest
Error: Expected one of #, => at line 12, column 12 (byte 929) after # Basic dumb simple networker daemon log grok filter for the NetWorker daemon.log
# no smarts to this and not really pulling any useful info from the files (yet)
filter {
grok {
... lines deleted ...
# attempt to find completed savesets and pull that info from the daemon_message field
if
我是 logstash 的新手,我意识到在 grok
语句中使用条件可能是不可能的,但我更喜欢以这种方式进行条件处理而不是额外的 match
行因为这会使 daemon_message 字段完好无损地用于其他用途,同时提取我想要的数据。
ETA:我还应该指出,完全删除 if
语句允许配置测试通过并允许过滤器解析日志。
提前致谢...
条件超出了过滤器,所以类似于:
if [field] == "value" {
grok {
...
}
]
是正确的。在你的情况下,做第一个 grok,然后测试到 运行 第二个,即:
grok {
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
}
if [daemon_message] =~ /done\ saving\ to\ pool/ {
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
}
这实际上是 运行为一条匹配的记录设置了两个正则表达式。由于 grok 只会在正则表达式匹配时创建字段,您可以这样做:
grok {
match => [ "message", "%{NUMBER:engcode1} %{DATESTAMP_12H:timestamp} %{NUMBER:engcode2} %{NUMBER:engcode3} %{NUMBER:engcode4} %{NUMBER:ppid} %{NUMBER:pid} %{NUMBER:engcode5} %{WORD:processhost} %{WORD:processname} %{GREEDYDATA:daemon_message}" ]
}
grok {
match => [ "daemon_message", "%{WORD:savehost}\:%{WORD:saveset} done saving to pool \'%{WORD:pool}\' \(%{WORD:volume}\) %{WORD:saveset_size}" ]
}
您必须衡量实际日志文件的性能,因为这会 运行 更少的正则表达式,但第二个更复杂。
如果您真的想疯狂,可以使用 break_on_match 功能在一个 grok{} 中完成所有这些操作。