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
再次运行测试,没问题。