在管道中使用 if 语句时出现 Logstash 错误
Logstash error when using if statement in pipeline
我正在尝试确定某个字段是否存在于日志文件中,如果存在,则使用该字段的值作为索引名称的一部分。如果该字段不存在,请使用不同的索引名称。
beats {
port => 5000
}
}
filter {
}
output {
elasticsearch {
hosts => ["https://elasticserver.io:9243"]
user => "user"
password => "pass"
retry_on_conflict => "2"
if [index_append] {
index = "%{[@metadata][beat]}%{index_append}"
}
else {
index = "%{[@metadata][beat]}"
}
"action" => "create"
}
}
如果我删除输出部分中的 if 语句和索引选项之一(index = "%{[@metadata][beat]}%{index_append}",或 index = “%{[@metadata][beat]}”)管道加载正常,但不考虑字段 'index_append' 何时存在。
我尝试了很多组合,但 logstash 日志似乎表明存在某种语法问题。
[2021-06-09T17:17:38,658][ERROR][logstash.agent ] Failed to execute action {:id=>:"LogstashPipeline", :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Expected one of [ \t\r\n], \"#\", \"=>\" at line 14, column 8 (byte 259) after output {\n elasticsearch {\n hosts => [\"https://elasticserver.io:9243\"]\n user => \"user\"\n password => \"pass\"\n retry_on_conflict => \"2\"\n if ", :backtrace=>["/opt/logstash/logstash-core/lib/logstash/compiler.rb:32:in `compile_imperative'", "org/logstash/execution/AbstractPipelineExt.java:184:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:69:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline_action/reload.rb:53:in `execute'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:389:in `block in converge_state'"]}
我尝试将 if 语句移动到过滤器部分,但在 logstash 日志中收到相同的错误。我在其他管道中使用过类似的 if 语句,但没有遇到过这些类型的问题。我将代码复制到 VS Code 并验证没有多余的空格或字符。我很茫然。
此管道在 Logstash 7.10.2
上 运行
将条件移动到过滤器部分。使用 [@metadata] 下的字段来存储索引名称。默认情况下 [@metadata] 不会被输出写入,因此它对于存储临时变量很有用。
if [index_append] {
mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}%{index_append}" } }
} else {
mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}" } }
}
然后使用
在输出中引用它
index => "%{[@metadata][index]}"
我正在尝试确定某个字段是否存在于日志文件中,如果存在,则使用该字段的值作为索引名称的一部分。如果该字段不存在,请使用不同的索引名称。
beats {
port => 5000
}
}
filter {
}
output {
elasticsearch {
hosts => ["https://elasticserver.io:9243"]
user => "user"
password => "pass"
retry_on_conflict => "2"
if [index_append] {
index = "%{[@metadata][beat]}%{index_append}"
}
else {
index = "%{[@metadata][beat]}"
}
"action" => "create"
}
}
如果我删除输出部分中的 if 语句和索引选项之一(index = "%{[@metadata][beat]}%{index_append}",或 index = “%{[@metadata][beat]}”)管道加载正常,但不考虑字段 'index_append' 何时存在。
我尝试了很多组合,但 logstash 日志似乎表明存在某种语法问题。
[2021-06-09T17:17:38,658][ERROR][logstash.agent ] Failed to execute action {:id=>:"LogstashPipeline", :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Expected one of [ \t\r\n], \"#\", \"=>\" at line 14, column 8 (byte 259) after output {\n elasticsearch {\n hosts => [\"https://elasticserver.io:9243\"]\n user => \"user\"\n password => \"pass\"\n retry_on_conflict => \"2\"\n if ", :backtrace=>["/opt/logstash/logstash-core/lib/logstash/compiler.rb:32:in `compile_imperative'", "org/logstash/execution/AbstractPipelineExt.java:184:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:69:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline_action/reload.rb:53:in `execute'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:389:in `block in converge_state'"]}
我尝试将 if 语句移动到过滤器部分,但在 logstash 日志中收到相同的错误。我在其他管道中使用过类似的 if 语句,但没有遇到过这些类型的问题。我将代码复制到 VS Code 并验证没有多余的空格或字符。我很茫然。
此管道在 Logstash 7.10.2
上 运行将条件移动到过滤器部分。使用 [@metadata] 下的字段来存储索引名称。默认情况下 [@metadata] 不会被输出写入,因此它对于存储临时变量很有用。
if [index_append] {
mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}%{index_append}" } }
} else {
mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}" } }
}
然后使用
在输出中引用它index => "%{[@metadata][index]}"