關於LogStash運行在AIX 64位機器上的問題與臨時解決方案


需求;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第三方提供的包來做這件事.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM