项目需求,在win7下搭建了ELK,并且将Oracle数据导入ES中,之前通过logstash将oracle中的数据导入es都没有问题,后来突然用同样的命令启动logstash后就shut down了,很奇怪,多次启动都shut down后,开始排除问题。
报错信息主要为:
Error registering plugin {:pipeline_id=>"main", :plugin=>"
……………………………………………………
……………………………………………………
……………………………………………………
……………………其他信息在此省略………………………………
……………………主要看下面………………………………
……………………………………………………
:error=>"(<unknown>): 'reader' unacceptable code point '\u0000' (0x0) special characters are not allowed\nin \"'reader'\", position 0 at line 0 column 0", :thread=>"#<Thread:0x670f2a35 run>"}
上述错误出现'\u0000' (0x0) special characters are not allowed,不允许特殊字符,那么就检查自己的conf文件。
1、是不是conf文件的内容书写错误
我的conf内容为
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
stdin {
}
jdbc {
jdbc_driver_library => "D:/logstash-6.8.6/logstash-core/lib/jars/ojdbc6-11.2.0.3.jar"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
jdbc_connection_string => "jdbc:oracle:thin:@ip:1521:orcl"
jdbc_user => "用户名"
jdbc_password => "123456"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
statement_filepath => "D:/logstash-6.8.6/bin/sql/XXX.sql"
schedule => "* * * * *"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => ["ip:9200"]
# index => "%{es_index}_index"
index => "smq"
document_type => "doc"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
conf内容书写检查了好几遍,甚至删除了所有空格,都不行,拷贝了同事的conf文件(他的能正常启动),也不行。
2、是不是conf文件的编码错误
我用EditPlus打开conf文件查看编码格式,发现不是UTF-8,(心里有点欣喜,估计改了编码就行了)将conf文件改为了UTF-8编码,启动logstash,结果又shut down了。(无奈)
解决:
上网找,大多数解释都没有参考价值,CSDN上几乎没有解决方法,最后在https://stackoverflow.com/questions/49840865/logstash-pipeline-error-error-registering-jdbc-plugin网站上找到了相关解释,这篇解释的最后,这样一句话引起了我的注意:
If your config is valid, then looks at $USER_HOME/.logstash_jdbc_last_run file, probably that file exists but isn't valid YAML. Fix what's broken about the file, or just delete it.
意思就是看看你的用户文件路径下是否存在.logstash_jdbc_last_run文件,可能存在但不是有效的yaml,修复或者删除它。然后我进入C盘的用户路径下,果然有这个文件,但是打开什么都没有,果断删了,然后再启动logstash,这次启动成功,Oracle的数据也导入到ES了。
然后返回看C盘的用户路径,logstash_jdbc_last_run文件又生成了,打开看里面其实就是一个启动logstash的UTC时间(世界协调时间)。
有时间再研究stackoverflow网站吧,感觉挺有用。