java - Logstash-Logback 编码器:“IllegalAccessError:无法访问类 […]”
问题描述
我尝试使用 Logstash tcp 套接字附加程序从 Java 应用程序将日志发送到 Logstash。Java 应用程序。已经可以与 logback 1.1.9 (slf4j) 和其他 appender 一起使用。
现在我将以下行添加到 logback-test.xml:
<configuration>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>[IP]:5010</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<message>log_msg</message>
</fieldNames>
</encoder>
<keepAliveDuration>5 minutes</keepAliveDuration>
</appender>
<root>
<level value="info"/>
<appender-ref ref="logstash" />
</root>
</configuration>
但是,当我添加附加程序并启动我的 java 应用程序时,我从 JVM 启动器中收到一个错误“发生 Java 异常”,并且我收到以下控制台文本:
Exception in thread "main" java.lang.IllegalAccessError: failed to access class ch.qos.logback.core.status.OnPrintStreamStatusListenerBase from class net.logstash.logback.status.LevelFilteringStatusListener (ch.qos.logback.core.status.OnPrintStreamStatusListenerBase and net.logstash.logback.status.LevelFilteringStatusListener are in unnamed module of loader 'app')
at net.logstash.logback.status.LevelFilteringStatusListener.setDelegate(LevelFilteringStatusListener.java:67)
at net.logstash.logback.appender.AsyncDisruptorAppender.start(AsyncDisruptorAppender.java:370)
at net.logstash.logback.appender.AbstractLogstashTcpSocketAppender.start(AbstractLogstashTcpSocketAppender.java:1009)
at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:158)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:145)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:103)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
我包含了 logstash 6.3 jar 文件,由于这个错误,我还尝试使用旧版本 4.9。有谁知道这是否与 logback 1.1.9 兼容?我没有使用 Spring-Boot。
---------编辑 17.02.2020------------
我输入的 logstash.conf 文件(因为我没有从我的 java 应用程序中获得任何日志):
input {
tcp {
mode => "server"
port => 5010
codec => json
}
}
解决方案
您可以通过应用以下任何解决方案来避免遇到的异常:
A) 使用 logback 版本 >= 1.1.10
或者
B)添加<addDefaultStatusListener>false</addDefaultStatusListener>
到您的附加程序定义(请参阅此处的详细信息)
或者
C) 在你的 logback 配置中添加一个状态监听器(这会阻止 logstash-logback-encoder 添加一个默认的状态监听器)。
发生异常是因为 logstash-logback-encoder 版本 >= 6.0ch.qos.logback.core.status.OnPrintStreamStatusListenerBase
在添加默认状态侦听器时引用 logback 的类。 OnPrintStreamStatusListenerBase
在 logback 1.1.10 中公开,在此之前是包私有的。
应用上述任何解决方案将避免您遇到的异常。但是,请记住,logstash-logback-encoder 版本 >= 4.8 是针对 logback 1.2.x 进行编译和测试的。因此,您在使用 logback 1.1.x 时可能会遇到其他错误。logstash-logback-encoder 自述文件包含有关此主题的以下声明:
比 pom 文件中指定的版本更旧的版本可能有效,但 pom 文件中的版本是已针对其执行的测试。
推荐阅读
- javascript - 当 uint32 是 256 加 10 的倍数时,JavaScript 无法从 C 接收 JSON?
- python - 如何防止 WebKit2.WebView 在 set_zoom_level() 之后自动滚动到顶部?
- android - React Native - Android - 如何将活动转换为透明?
- hellosign-api - HelloWorks - 如何将显示文本组件添加到条件规则组件
- asp.net-mvc - 从 TFS 中的发布/发布中排除上次签入
- swift - 我的返回值为 nil,我不知道为什么(Swift)
- google-sheets - 条件格式,单元格引用移位
- python - 如何为文档相似度创建一个新的余弦相似度函数
- c++ - 尝试创建一个以表格格式传递二维数组输出数组的函数(类似于 python3 中的制表)
- javascript - 在javascript的后台使用post方法打开url