Logstash-Logback Encoder: “IllegalAccessError: failed to access class […]”
Logstash-Logback Encoder: “IllegalAccessError: failed to access class […]”
我尝试使用 Logstash tcp 套接字附加程序从 java 应用程序发送日志到 logstash。 java 应用程序。已经与 logback 1.1.9 (slf4j) 和其他附加程序一起工作。
现在我将以下行添加到 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>
但是当我添加 appender 并启动我的 java 应用程序时,我从 JVM Launcher "A Java Exception has occured" 收到一个错误,并且我收到以下控制台文本:
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>
添加到您的 appender 定义中(查看详细信息 here)
或
C) 将 status listener 添加到您的 logback 配置(这会阻止 logstash-logback-encoder 添加默认状态侦听器)。
出现异常是因为logstash-logback-encoder版本>=6.0引用logback的ch.qos.logback.core.status.OnPrintStreamStatusListenerBase
class时添加了default status listener。 OnPrintStreamStatusListenerBase
是在 logback 1.1.10 中制作的 public,并且在那之前是包私有的。
应用上述任何解决方案都将避免您遇到的异常。但是,请记住 logstash-logback-encoder 版本 >= 4.8 是针对 logback 1.2.x 编译和测试的。因此,您在使用 logback 1.1.x 时可能会遇到其他错误。 logstash-logback-encoder 自述文件包含有关此主题的以下声明:
Older versions than the ones specified in the pom file might work, but the versions in the pom file are what testing has been performed against.
解法:
我将 logback 从 1.1.9 更新到 1.2.3。当我替换 jar 文件并将它们添加到 class 路径时,我收到了 600 多次以下错误消息:Logger cannot be resolved to a type
。我通过从 logback 项目打开 Eclipse 中的属性、继续“订购和导出”并在每个复选框中设置标记 --> 应用并关闭来修复此问题。现在我不再收到 IllegalAccessError,我的 java 应用程序 运行 正常。而且我现在也可以在 Logstash 和 Kibana 中看到日志 :)
我下载了以下文件:
- jcl-over-slf4j 1.7.25
- 7 月到 slf4j 1.7.25
- log4j-over-slf4j 1.7.25
- slf4j-api 1.7.25
- logback-classic 1.2.3
- logback-核心 1.2.3
我从这里下载的:
https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3
我尝试使用 Logstash tcp 套接字附加程序从 java 应用程序发送日志到 logstash。 java 应用程序。已经与 logback 1.1.9 (slf4j) 和其他附加程序一起工作。
现在我将以下行添加到 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>
但是当我添加 appender 并启动我的 java 应用程序时,我从 JVM Launcher "A Java Exception has occured" 收到一个错误,并且我收到以下控制台文本:
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>
添加到您的 appender 定义中(查看详细信息 here)
或
C) 将 status listener 添加到您的 logback 配置(这会阻止 logstash-logback-encoder 添加默认状态侦听器)。
出现异常是因为logstash-logback-encoder版本>=6.0引用logback的ch.qos.logback.core.status.OnPrintStreamStatusListenerBase
class时添加了default status listener。 OnPrintStreamStatusListenerBase
是在 logback 1.1.10 中制作的 public,并且在那之前是包私有的。
应用上述任何解决方案都将避免您遇到的异常。但是,请记住 logstash-logback-encoder 版本 >= 4.8 是针对 logback 1.2.x 编译和测试的。因此,您在使用 logback 1.1.x 时可能会遇到其他错误。 logstash-logback-encoder 自述文件包含有关此主题的以下声明:
Older versions than the ones specified in the pom file might work, but the versions in the pom file are what testing has been performed against.
解法:
我将 logback 从 1.1.9 更新到 1.2.3。当我替换 jar 文件并将它们添加到 class 路径时,我收到了 600 多次以下错误消息:Logger cannot be resolved to a type
。我通过从 logback 项目打开 Eclipse 中的属性、继续“订购和导出”并在每个复选框中设置标记 --> 应用并关闭来修复此问题。现在我不再收到 IllegalAccessError,我的 java 应用程序 运行 正常。而且我现在也可以在 Logstash 和 Kibana 中看到日志 :)
我下载了以下文件:
- jcl-over-slf4j 1.7.25
- 7 月到 slf4j 1.7.25
- log4j-over-slf4j 1.7.25
- slf4j-api 1.7.25
- logback-classic 1.2.3
- logback-核心 1.2.3
我从这里下载的:
https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3