java syslog4j+elasticsearch引发的问题

    项目中用到了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



再次运行测试,没问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容