ELK新手用Logstash同步MySQL到ES遇插件注册错误求助
解决Logstash JDBC插件注册时的
TypeError: can’t dup Fixnum错误 嘿,刚入门ELK就碰到这个坑太正常了,我来帮你捋清楚这个问题。你遇到的TypeError: can’t dup Fixnum错误,本质是Logstash在注册插件时,尝试对一个整数(Fixnum)调用了dup方法——但整数类型根本没有这个方法,只有字符串、数组这类对象才有,所以肯定是你的配置文件里某个参数的类型写错了。
下面是具体的排查和修复步骤:
优先检查插件的
id参数
如果你的配置里给JDBC输入插件(或者其他插件)设置了id => 123这类数字格式的ID,赶紧改成字符串形式,比如id => "mysql_input_1"。Logstash的插件ID要求是字符串类型,写成数字的话就会触发这个错误,这是最常见的诱因。核查JDBC输入的参数类型
重点排查这些容易踩坑的参数:- 看看有没有把本该是字符串的参数写成了数字,比如
ssl_mode如果写成ssl_mode => 1而不是ssl_mode => "REQUIRED"这种字符串值,就可能出问题; - 检查
parameters块,如果里面的参数键是数字(比如parameters => { 1 => "test" }),改成字符串键:parameters => { "id" => 1 },键为整数也可能触发类型错误。
- 看看有没有把本该是字符串的参数写成了数字,比如
用最简配置做测试
先把你的配置简化成最基础的版本,排除其他干扰项,比如:input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/testdb" jdbc_user => "你的MySQL用户名" jdbc_password => "你的MySQL密码" jdbc_driver_library => "/path/to/mysql-connector-java-5.1.47.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" statement => "SELECT * FROM 你的表名" } } output { elasticsearch { hosts => ["localhost:9200"] index => "test_index" document_id => "%{id}" } stdout { codec => rubydebug } }用这个最简配置执行
bin/logstash -f /path/to/simple.conf,如果能正常运行,再逐步加回你原来的配置项,每次加一项就测试,这样就能精准定位到出问题的参数。额外提醒:驱动版本要匹配
确保你用的MySQL JDBC驱动版本和MySQL服务器、Logstash 6.2.4兼容,建议用5.1.x系列的驱动(比如mysql-connector-java-5.1.47.jar),太新的驱动可能和旧版本Logstash存在兼容性问题。
内容的提问来源于stack exchange,提问作者Chu
相关产品推荐
相关产品推荐

