Logstash报错‘Expected one of #, =>’原因及配置修复咨询
你的配置出现致命错误的核心原因是连续使用了两个else语句,这违反了Logstash条件判断的语法规则——一个if只能对应一个else,多分支的条件判断需要用elsif(即else if)来衔接。
问题代码分析
看你提供的代码片段,在第152行的else之前,已经存在一个完整的else代码块:
else { if [kubernetes][labels][version] != "v2" { date { match => [ "syslog_timestamp", "ISO8601" ] remove_field => [ "syslog_timestamp" ] } } prune { whitelist_names => ["^message_csv$","^host$","^beat","^source$","^type$","^offset$","@timestamp","kubernetes"] } mutate { add_tag => [ "haproxy-logs" ] remove_tag => [ "_csvparsefailure" ] } }
紧接着又写了else {,这会让Logstash的语法解析器无法识别这个else对应的是哪个if分支,因此抛出了语法错误。
修复方案
根据你的业务逻辑需求,有两种修复方式:
- 如果是添加新的条件分支:把第152行的
else改成elsif,并补充对应的判断条件(比如你需要判断的字段或标签规则)。示例如下:
} elsif [kubernetes][labels][some_key] == "some_value" { # 替换为你实际的判断条件
if "ambassador" in [kubernetes][labels][service] {
grok { match => { "message" => '^%{TIMESTAMP_ISO8601:time} %{IP:clientip}:%{NUMBER:port} %{WORD:verb} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion} %{NUMBER:http_status} %{NOTSPACE:response_flag} %{NUMBER:bytes_received} %{NUMBER:bytes_sent} %{NUMBER:request_time} '%{NOTSPACE:X-Forwarded-for}' '%{NOTSPACE:X-OURDOMAIN-Api}' '%{DATA:agent}' '%{NOTSPACE:UUID}' '%{NOTSPACE:X-Forwarded-Client-Cert}' '%{NOTSPACE:authority}' '%{NOTSPACE:upstream_host}'' } }
mutate { convert => { "http_status" => "integer" "bytes_sent" => "integer" "bytes_received" => "integer" "request_time" => "integer" } }
# 后续其他配置
}
}
- **如果是作为最终兜底分支**:调整前面的逻辑结构,将第一个`else`改为`elsif`并补充对应的条件,让最后一个`else`成为整个条件链的收尾分支,确保结构符合`if -> elsif* -> else?`的规则。 修复后,重新运行`bin/logstash --config.test_and_exit -f ../kubernetes-internal/02-filter.conf`验证语法,确保所有条件分支的括号和逻辑都正确闭合。 内容的提问来源于stack exchange,提问作者lsambo

