Logtash报错:undefined method tr及SLF4J多绑定问题咨询
解决Logstash的两个常见问题:
undefined method tr 报错与SLF4J多绑定警告 我来帮你逐个搞定这俩问题,都是Logstash用起来常碰到的场景:
1. 处理 undefined method tr 报错
这个错误说白了就是你在配置或插件代码里,试着给非字符串类型的对象调用Ruby的tr方法了——比如对象是nil、数字或者数组,自然没这个方法。按下面步骤排查修复:
- 先定位问题代码:翻一遍你所有的Logstash配置文件(一般在
conf.d/目录下),重点盯filter段落里的ruby插件或mutate插件配置。比如如果有类似这样的代码:
要是ruby { code => 'event.set("cleaned_field", event.get("raw_field").tr("[:punct:]", ""))' }raw_field不存在(值为nil)或者不是字符串,肯定会触发这个报错。 - 修复方式:加个类型判断,或者强制转成字符串,比如改成这样:
ruby { code => ' raw_val = event.get("raw_field") if raw_val.is_a?(String) event.set("cleaned_field", raw_val.tr("[:punct:]", "")) else event.set("cleaned_field", raw_val.to_s.tr("[:punct:]", "")) end ' } - 另外也可能是插件版本不兼容:试试更新相关插件,执行命令:
要是不知道具体哪个插件,也可以直接更新所有插件(记得先备份配置)。bin/logstash-plugin update [你的插件名称]
2. 解决SLF4J多绑定警告
这个警告是因为类路径里同时装了两个SLF4J的实现包,SLF4J懵了不知道该用哪个。从你给的日志看,冲突的是log4j-slf4j-impl-2.6.2.jar和slf4j-simple.jar,两种解决方法选一个就行:
- 方案一:删掉冲突的jar包(推荐)
Logstash默认用Log4j2当日志框架,所以留着log4j-slf4j-impl就行,把slf4j-simple.jar删掉。找到对应路径:
直接删了这个文件就好。/usr/share/logstash/vendor/bundle/jruby/1.9/gems/march_hare-3.0.0-java/lib/ext/slf4j-simple.jar - 方案二:强制指定SLF4J绑定
要是不想删jar包,就在Logstash的启动参数里指定用Log4j2的绑定。修改Logstash的启动脚本(比如/usr/share/logstash/bin/logstash),在JAVA_OPTS里加这么一句:
保存后重启Logstash,警告就没了。-Dslf4j.provider=org.apache.logging.slf4j.Log4jLoggerFactory
验证修复
做完上面的操作后,重启Logstash,去/data/logs/logstash目录下看日志,确认报错和警告是不是都消失了。
内容的提问来源于stack exchange,提问作者glmrenard
相关产品推荐
相关产品推荐

