【问题标题】:NullPointerException in RequestLogCollection Jetty 9.3.9RequestLogCollection Jetty 9.3.9 中的 NullPointerException
【发布时间】:2016-06-21 06:05:26
【问题描述】:

我在我的嵌入式应用程序中使用 Jetty 9.3.9.v20160517,并且我已经使用 jetty-requestlog.xml 配置了日志记录,如下所示:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">

<!-- =============================================================== -->
<!-- Configure the Jetty Request Log                                 -->
<!-- =============================================================== -->
<Configure id="Server" class="org.eclipse.jetty.server.Server">

  <!-- =========================================================== -->
  <!-- Configure Request Log for Server                            -->
  <!-- (Use RequestLogHandler for a context specific RequestLog    -->
  <!-- =========================================================== -->
  <Set name="RequestLog">
    <New id="RequestLog" class="org.eclipse.jetty.server.AsyncNCSARequestLog">
      <Set name="filename"><Property name="jetty.base" default="." /><Property>
          <Name>jetty.requestlog.filePath</Name>
          <Deprecated>requestlog.filename</Deprecated>
          <Default><Property name="jetty.requestlog.dir" default="/logs"/>/yyyy_mm_dd.request.log</Default>
        </Property>
      </Set>
      <Set name="filenameDateFormat"><Property name="jetty.requestlog.filenameDateFormat" deprecated="requestlog.filenameDateFormat" default="yyyy_MM_dd"/></Set>
      <Set name="retainDays"><Property name="jetty.requestlog.retainDays" deprecated="requestlog.retain" default="90"/></Set>
      <Set name="append"><Property name="jetty.requestlog.append" deprecated="requestlog.append" default="true"/></Set>
      <Set name="extended"><Property name="jetty.requestlog.extended" deprecated="requestlog.extended" default="false"/></Set>
      <Set name="logCookies"><Property name="jetty.requestlog.cookies" deprecated="requestlog.cookies" default="false"/></Set>
      <Set name="LogTimeZone"><Property name="jetty.requestlog.timezone" deprecated="requestlog.timezone" default="GMT"/></Set>
    </New>
  </Set>
</Configure>

但是,在运行时,当 Jetty 实际尝试记录任何内容时,我每次向服务器发出请求时都会得到以下 NPE,即使这些日志似乎确实写入了 $jetty.base/logs/2016_06_15.request.log

2016-06-15 22:19:23,302 [eXistThread-29] WARN  (HttpChannel.java [handle]:479) - //localhost:8080/exist/apps/dashboard/modules/get-icon.xql?package=http://exist-db.org/apps/eXide 
java.lang.NullPointerException
    at org.eclipse.jetty.server.RequestLogCollection.log(RequestLogCollection.java:44) ~[jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.HttpChannel.onCompleted(HttpChannel.java:620) ~[jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:453) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_92]

那么...是什么导致了这些 NPE,我该如何解决?

【问题讨论】:

标签: jetty embedded-jetty jetty-9


【解决方案1】:

您的XML load order is bad(请参阅您的源代码中的etc/enabled-jetty-config

I mentioned this in an earlier answer.

您可以通过以下方式了解此订单的运作方式。

使用jetty-distribution :-)

# Use a new empty base
$ cd /path/to/mybase

# Lets add the modules into this base
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=annotations,deploy,https,gzip,jmx,requestlog
INFO: server          initialised (transitively) in ${jetty.base}/start.ini
INFO: gzip            initialised in ${jetty.base}/start.ini
INFO: jmx             initialised in ${jetty.base}/start.ini
INFO: requestlog      initialised in ${jetty.base}/start.ini
INFO: ssl             initialised (transitively) in ${jetty.base}/start.ini
INFO: https           initialised in ${jetty.base}/start.ini
INFO: deploy          initialised in ${jetty.base}/start.ini
INFO: annotations     initialised in ${jetty.base}/start.ini
MKDIR: ${jetty.base}/logs
DOWNLOAD: https://raw.githubusercontent.com/eclipse/jetty.project/master/jetty-server/src/test/config/etc/keystore?id=master to ${jetty.base}/etc/keystore
MKDIR: ${jetty.base}/webapps
INFO: Base directory was modified

# Lets ask the jetty-distribution what its XML load order is
java -jar /path/to/jetty-dist/start.jar --list-config
...(snip lots of output)...
Jetty Active XMLs:
------------------
 ${jetty.home}/etc/jetty.xml
 ${jetty.home}/etc/jetty-gzip.xml
 ${jetty.home}/etc/jetty-jmx.xml
 ${jetty.home}/etc/jetty-requestlog.xml
 ${jetty.home}/etc/jetty-ssl.xml
 ${jetty.home}/etc/jetty-ssl-context.xml
 ${jetty.home}/etc/jetty-https.xml
 ${jetty.home}/etc/jetty-deploy.xml
 ${jetty.home}/etc/jetty-plus.xml
 ${jetty.home}/etc/jetty-annotations.xml

注意:此加载顺序可以(并且确实!)在 Jetty 版本之间更改。 不要依赖这是所有版本的 Jetty 的真正加载顺序。您要么必须实现相同的 start.jar 模块逻辑,要么在每次升级项目时重做此 jetty-distribution/start.jar --list-config

警告:不要这样做,不要混合jetty-distributionembedded-jetty,你只是在为自己创造大量额外的工作,增加你的维护任务等等。使用@ 987654330@ *或* jetty-distribution 直接。

【讨论】:

  • 我很欣赏你所说的,但 jetty-distribution 并不真正适合我们的项目需求。 jetty-embedded 更接近我们的需要,但是我真的很喜欢模块化 XML 配置的想法,因为它允许我们的用户按照他们喜欢的方式重新配置 jetty。但是,也许我应该放弃模块化,只使用一个包含所有配置的 XML 文件?
  • 如果我将顺序更改为您建议的顺序,那么 jetty-jaas.xml 和 jetty-gzip.xml 都会出现问题。 java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.FormAuthenticator@57545c3f in org.eclipse.jetty.security.ConstraintSecurityHandler@58fa5769 at org.eclipse.jetty.security.authentication.LoginAuthenticator.setConfiguration(LoginAuthenticator.java:76)java.lang.ClassCastException: org.eclipse.jetty.server.handler.gzip.GzipHandler cannot be cast to org.eclipse.jetty.server.handler.HandlerCollection
  • 那么您有 2 个新问题。 (顺便说一句,您的混合方法是导致您出现问题的原因。您的 embedded-jetty 假设您基于 jetty-distribution 的 XML 不符合)
  • 那么你是否同意我唯一合理的选择是当使用 jetty-embedded 并想要一个外部配置文件时,只使用一个 XML 配置文件,其中包含所有内容?跨度>
  • 单个或多个 XML 之间的决定是无关紧要的(两种选择同样有效)。决定应该是关于控制、一致性和理解您的 XML 和您在嵌入式码头逻辑中的 XML 设置之后拥有的代码之间设置的性质(现在,您只是向它扔码头分发 XML,而不是了解 XML 要求,XML 实际在做什么,并且对嵌入式码头不工作感到沮丧)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多