Logstash配置文件出现Expected one of错误,请求协助排查修复
Logstash配置文件出现Expected one of错误,请求协助排查修复
我帮你梳理下你这个Logstash配置里的几个问题,这些应该就是触发Expected one of错误的根源:
GELF插件的Ruby代码块语法错误
你原来用rb => |来定义自定义Ruby方法是不对的,Logstash里自定义Ruby代码块需要用 heredoc 格式(<<CODE开头,CODE结尾)来包裹代码。另外原来的三元表达式写法太紧凑,容易引发语法问题,改成更清晰的if-else结构会更稳妥。修复后的GELF输入配置应该是这样:gelf { host => "0.0.0.0" port => 12201 rb => <<CODE def self.coerce_timestamp(timestamp) if timestamp.is_a?(BigDecimal) LogStash::Timestamp.at(timestamp.to_i, timestamp.frac * 1000000) else LogStash::Timestamp.at(timestamp) end end CODE }配置中的转义字符错误
你配置里出现的=>和"是HTML转义字符,在Logstash配置文件里应该直接使用原生的=>和双引号",不需要转义,否则Logstash会无法正确解析这些语法符号。Filter部分配置未闭合
你提供的filter配置最后是截断的(&q...),这明显是引号和大括号没有正确闭合导致的。比如你原本的第二个parentId判断逻辑,应该补全成完整的闭合结构:if [parentId] =~ /^0/ { mutate { replace => { "parentId" => "0" } } }要确保所有的大括号、引号都一一对应,这是Logstash配置最常见的语法错误原因。
修复后的完整配置示例
input { gelf { host => "0.0.0.0" port => 12201 rb => <<CODE def self.coerce_timestamp(timestamp) if timestamp.is_a?(BigDecimal) LogStash::Timestamp.at(timestamp.to_i, timestamp.frac * 1000000) else LogStash::Timestamp.at(timestamp) end end CODE } http { ssl => false host => "0.0.0.0" port => 8080 } tcp { mode => "server" host => "0.0.0.0" port => 5010 } udp { host => "0.0.0.0" port => 5000 } } filter { if [parentId] =~ "0" { mutate { replace => { "parentId" => "0" } } } if [parentId] =~ /^0/ { mutate { replace => { "parentId" => "0" } } } } # 记得根据你的实际需求补全output配置,比如输出到Elasticsearch # output { # elasticsearch { # hosts => ["your-es-host:9200"] # } # }
调整完配置后,你可以用Logstash自带的配置测试命令验证语法是否正确:
logstash -f your-config-file.conf --config.test_and_exit
如果没有报错,就说明配置语法没问题啦。
备注:内容来源于stack exchange,提问作者sledge13
相关产品推荐
相关产品推荐

