Elaticsearch进阶

java syslog4j+elasticsearch引发的问题

2018-09-14  本文已影响9人  熊孩子_QAQ

    项目中用到了syslog和elasticsearch(2.4.0),本来两个没有任何交集,使用Syslog的API也没任何异常情况。后期发现提高elasticsearch的版本所带来的优点还是很明显的。最终升级到6版本,同时pom也需要修改。

   
但是测试Syslog的API时发现报错 java.lang.NoClassDefFoundError:Syslog

引发NoClassDefFoundError原因如下几种:

1.项目依赖的jar包不存在(排除)

2.对应的类静态代码块抛出异常

针对第二种进入Syslog源代码

根据配置初始化对应的协议类
根据传入的配置调用getSyslogClass来初始化 此处调用父类的方法 AbstractSyslog
81行调用各个实现类的initialize方法

上面报错的信息是UnixSocketSyslog类,那么看该类的initialize方法

84行代码初始化内部类SockAddr 发现该类有问题,没有实现接口对应的方法
从而导致NoClassDefFoundError

但是细想syslog提供的jar包不可能发生这么低级错误呀。点击Structure发现该类居然是elasticsearch包下的,为了解决这个错又引入了

不报错了,再次测试还是有问题,看UnixSocketSyslog源代码发现调用loadLibrary()会调用JNA来调用本地的动态链接库lib6.so(java调用C)

此时一脸懵B,什么玩意

elasticsearch低版本时没有这类问题呀,再次看Syslog源码

执行UnixSocketSyslog是有条件的

1.符合操作系统

2.有com.sun.jna.Native 这个类

而高版本的elasticsearch恰好有这个类,所以最总解决方案是去掉com.sun.jna 和elasticsearch中的jna


再次运行测试,没问题。

上一篇下一篇

猜你喜欢

热点阅读