需求;logstash運行在SUSE,LINUX,PPC LINUX,AIX機器上,並監控文件發送日志到KAFKA中去,
問題:在AIX機器上,file插件總是報異常,無法完成數據的讀取
NotImplementedError: stat.st_dev unsupported or native support failed to load
分析:環境 :AIX 64 OSLEVEL :6.1.0 7.1.0
JDK : IBM JAVA 71 64
報錯顯示:是在獲取設備的主輔號時出了問題,顯示沒有實現的本地方法,沒有詳細的報錯信息,
我同事細查相關的JAVA源碼,一步一步地添加一些日志輸出,找到了報錯的具體原因.
我們看LOGSTASH的VENDOR JRUBY中就會發現,它的/vendor/jruby/lib/jni
下面沒有 PPC64-AIX文件夾,所以具體報錯的原因是沒有找到相對應的JNI需要調用的本地庫文件.
解決方案:
1.編譯一份AIX-64位的LIB庫文件放置到PPC64-AIX文件夾下
這個過程比較困難,相關的同事說做起來比較麻煩
2.臨時解決方案,
使用32位的JDK,因為JRUBY自身帶有32位的庫文件,然后修改一個地方:
我們直接修改源碼部分:
https://github.com/jnr/jnr-posix/blob/master/src/main/java/jnr/posix/POSIXFactory.java
中返回AIX類的固定讓它反回32位的庫文件.
case AIX:
return jnr.ffi.Runtime.getSystemRuntime().addressSize() == 4
? new String[] { "libc.a(shr.o)" }
: new String[] { "libc.a(shr_64.o)" };
寫死成:return new String[]{"libc.a(shr.o)"}
重新編譯,把編譯后的類替換原來jruby.jar包中相關的class文件,重新打包即可.
jar cMf ../jruby.jar *
java 調用本地庫文件來實現某些功能,JRUBY使用JNR/JFFI第三方提供的包來做這件事.