【问题标题】:NPE when using JUL with SLF4J at trace level在跟踪级别使用 JUL 和 SLF4J 时的 NPE
【发布时间】:2018-02-03 04:44:37
【问题描述】:

我按照Creating a Basic REST Web Service using Grizzly, Jersey 中提到的教程创建了一个示例应用程序。我已经使用 logback.xml 扩展了示例。后来我发现 jersey 使用 java.util.logging 并配置了一个 slf4j 桥。一切正常,但是当我在跟踪中具有 logback 级别时出现不可恢复的异常,并且当级别设置为调试或更高(INFO、WARN 等)时工作正常。

下面是堆栈跟踪 -

20:35:24.531 [grizzly-nio-kernel(7) SelectorRunner] WARN  o.g.g.filterchain.DefaultFilterChain - GRIZZLY0013: Exception during FilterChain execution
java.lang.NullPointerException: null
    at java.lang.String.<init>(String.java:166)
    at java.lang.String.valueOf(String.java:3008)
    at org.glassfish.grizzly.filterchain.FilterChainContext.toString(FilterChainContext.java:1076)
    at java.text.MessageFormat.subformat(MessageFormat.java:1280)
    at java.text.MessageFormat.format(MessageFormat.java:865)
    at java.text.Format.format(Format.java:157)
    at java.text.MessageFormat.format(MessageFormat.java:841)
    at org.slf4j.bridge.SLF4JBridgeHandler.getMessageI18N(SLF4JBridgeHandler.java:265)
    at org.slf4j.bridge.SLF4JBridgeHandler.callLocationAwareLogger(SLF4JBridgeHandler.java:220)
    at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:303)
    at java.util.logging.Logger.log(Logger.java:738)
    at java.util.logging.Logger.doLog(Logger.java:765)
    at java.util.logging.Logger.log(Logger.java:851)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:280)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.nio.NIOConnection.preClose(NIOConnection.java:879)
    at org.glassfish.grizzly.nio.transport.TCPNIOConnection.preClose(TCPNIOConnection.java:97)
    at org.glassfish.grizzly.nio.NIOConnection.terminate0(NIOConnection.java:603)
    at org.glassfish.grizzly.nio.transport.TCPNIOConnection.terminate0(TCPNIOConnection.java:291)
    at org.glassfish.grizzly.nio.NIOConnection$4.completed(NIOConnection.java:567)
    at org.glassfish.grizzly.nio.NIOConnection$4.completed(NIOConnection.java:563)
    at org.glassfish.grizzly.asyncqueue.AsyncWriteQueueRecord.notifyCompleteAndRecycle(AsyncWriteQueueRecord.java:173)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:279)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:169)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:71)
    at org.glassfish.grizzly.AbstractWriter.write(AbstractWriter.java:76)
    at org.glassfish.grizzly.nio.NIOConnection.closeGracefully0(NIOConnection.java:562)
    at org.glassfish.grizzly.nio.NIOConnection.closeWithReason(NIOConnection.java:513)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:160)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.nio.transport.TCPNIOServerConnection$RegisterAcceptedChannelCompletionHandler.completed(TCPNIOServerConnection.java:353)
    at org.glassfish.grizzly.nio.transport.TCPNIOServerConnection$RegisterAcceptedChannelCompletionHandler.completed(TCPNIOServerConnection.java:320)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.registerChannel0(DefaultSelectorHandler.java:336)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.access$400(DefaultSelectorHandler.java:64)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler$RegisterChannelOperation.run(DefaultSelectorHandler.java:467)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.processPendingTaskQueue(DefaultSelectorHandler.java:301)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.processPendingTasks(DefaultSelectorHandler.java:293)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.preSelect(DefaultSelectorHandler.java:101)
    at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:335)
    at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:279)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)

我的 logging.properties 文件 -

handlers = org.slf4j.bridge.SLF4JBridgeHandler
.level=ALL
java.util.logging.SLF4JBridgeHandler.level = ALL

我的 logback.xml 文件 -

<configuration>

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="trace">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

注意:如果有任何区别,我的主要方法中有以下内容

    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();

【问题讨论】:

  • 你的配置文件中真的有那个换行符吗?
  • @chrylis 你指的是 logging.properties 文件吗?

标签: java jersey logback slf4j java.util.logging


【解决方案1】:

这是 Grizzly 中的错误 FilterChainContext.toString crashes with NullPointerException #1959

String.valueOf 有两个重载,Object 和 char[]。 (Java 8) 由于 getMessage 中危险的未绑定泛型,这两个重载似乎都适用,但是选择了 char[] 重载,可能是因为它更具体。

[剪辑]

但是如果getMessage的结果为null,String.valueOf(char[])会失败。

您需要升级到较新版本的 Grizzly (2.4.3)。

【讨论】:

  • 我有jersey-container-grizzly2-http 的最新版本(2.26),它正在传递2.4.0 版本。一旦我升级到 grizzly 版本 2.4.3,错误就消失了。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2016-04-13
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多