Logstash-Logback 编码器:"非法访问错误:无法访问类 [...]"



我尝试将日志从带有 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>

但是,当我添加追加器并启动我的 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。有谁知道这是否与登录 1.1.9 兼容? 我没有使用Spring-Boot。

---------编辑17.02.2020-----------

我输入的logstash.conf文件(因为我没有从我的java应用程序获得任何日志(:

input {
tcp {
mode => "server"
port => 5010
codec => json
}
}

可以通过应用以下任一解决方案来避免遇到的异常:

A( 使用登录版本>= 1.1.10

B( 将<addDefaultStatusListener>false</addDefaultStatusListener>添加到追加器定义中(在此处查看详细信息(

C( 将状态侦听器添加到您的 logback 配置中(这会阻止 logstash-logback-encoder 添加默认状态侦听器(。

出现异常的原因是,添加默认状态侦听器时,logstash-logback-encoder 版本>= 6.0 引用 logback 的ch.qos.logback.core.status.OnPrintStreamStatusListenerBase类。OnPrintStreamStatusListenerBase在 logback 1.1.10 中公开,在此之前是包私有的。

应用上述任何解决方案都将避免您遇到的异常。 但是,请记住,logstash-logback-encoder 版本>= 4.8 是针对 logback 1.2.x 编译和测试的。 因此,在使用 logback 1.1.x 时可能会遇到其他错误。 logstash-logback-encoder 自述文件包含有关此主题的以下语句:

比 pom 文件中指定的版本更早的版本可能有效,但 pom 文件中的版本是已针对的版本执行的。

解决方案:

我将登录从 1.1.9 更新到 1.2.3。当我替换 jar 文件并将它们添加到类路径时,我收到了 600 多次以下错误消息:Logger cannot be resolved to a type.我通过从logback项目中打开Eclipse中的属性,进入"订购和导出"并在每个复选框中设置标记来解决此问题 ->应用并关闭。现在我不再收到IllegalAccessError,我的java应用程序运行良好。我现在还可以在 Logstash 和 Kibana 中看到日志:)

我下载了以下文件:

  • JCL-over-SLF4j 1.7.25
  • 七月到SLF4J 1.7.25
  • log4j-over-slf4j 1.7.25
  • SLF4J-API 1.7.25
  • 登录经典版 1.2.3
  • 登录核心 1.2.3

我从这里下载了它们:

https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3

最新更新