Play 2.1和Neo4J WrappingNeoServer在Logback.xml中出现错误

10

我之前在Play 2.0.1应用中嵌入了一个带有管理控制台的neo4j服务器。最近我升级了版本以适配DeadBolt,但发现应用程序无法运行。

我之前是通过以下方式启动服务器:

    graphDb = (GraphDatabaseAPI) new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder(CONF_DBMETA_LOCATION)
                .setConfig(ShellSettings.remote_shell_enabled, "true")
                .newGraphDatabase();
        ServerConfigurator config;
        config = new ServerConfigurator(graphDb);
        // let the server endpoint be on a custom port

        srv = new WrappingNeoServerBootstrapper(graphDb, config);
        srv.start();

不幸的是我遇到了以下问题:

> java.lang.RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> 'org.neo4j.kernel.logging.LogbackService@4c043845' failed to
> initialize. Please see attached cause exception.

我已经尝试从Build.scala中移除slf4j和logback依赖,但并没有成功。看起来neo4j正在加载错误的logback.xml文件。另外,如果在neo4j-server依赖项中添加notTransitive()函数,则启动时的logback.xml警告会消失。我想neo4j特定的logback.xml文件嵌入在jar包中,这可能导致了问题。我看到一个潜在解决方案是通过代码编写自定义配置,但我不确定如何做。你有什么想法吗?参考一下,我在启动时收到以下错误:

>     22:11:05,124 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback.groovy]
>     22:11:05,125 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback-test.xml]
>     22:11:05,125 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource
> [logback.xml] at
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
>     22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs multiple times on the classpath.
>     22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs at
> [jar:file:/Users/steve/Code/play-2.1-RC1/framework/../repository/cache/org.neo4j.app/neo4j-server/jars/neo4j-server-1.9-SNAPSHOT.jar!/logback.xml]
>     22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs at
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
>     22:11:05,139 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@733b8bc1 - URL
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
> is not of type file
>     22:11:05,265 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug
> attribute not set
>     22:11:05,614 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate
> appender of type [ch.qos.logback.core.ConsoleAppender]
>     22:11:05,625 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as
> [STDOUT]
>     22:11:05,657 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming
> default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for
> [encoder] property
>     22:11:05,707 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level
> of ROOT logger to ERROR
>     22:11:05,707 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching
> appender named [STDOUT] to Logger[ROOT]
>     22:11:05,707 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of
> configuration.
>     22:11:05,709 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@4a546701 - Registering
> current configuration as safe fallback point

完整的异常信息请见下文:

> play.api.UnexpectedException: Unexpected exception[RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> 'org.neo4j.kernel.logging.LogbackService@4c043845' failed to
> initialize. Please see attached cause exception.]     at
> play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:134)
> ~[play_2.10.jar:2.1-RC1]  at
> play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:101)
> ~[play_2.10.jar:2.1-RC1]  at scala.Option.map(Option.scala:145)
> ~[scala-library.jar:na]   at
> play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:101)
> ~[play_2.10.jar:2.1-RC1]  at
> play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:99)
> ~[play_2.10.jar:2.1-RC1]  at
> scala.util.Either$RightProjection.flatMap(Either.scala:523)
> [scala-library.jar:na] Caused by: java.lang.RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> 'org.neo4j.kernel.logging.LogbackService@4c043845' failed to
> initialize. Please see attached cause exception.  at
> org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:258)
> ~[neo4j-kernel-1.9.M03.jar:na]    at
> org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:88)
> ~[neo4j-kernel-1.9.M03.jar:na]    at
> org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:83)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:206)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> EmbeddedGraphDB.initializeDatabase(EmbeddedGraphDB.java:70)
> ~[na:na]  at
> EmbeddedGraphDB.<init>(EmbeddedGraphDB.java:51)
> ~[na:na] Caused by: org.neo4j.kernel.lifecycle.LifecycleException:
> Component 'org.neo4j.kernel.logging.LogbackService@4c043845' failed to
> initialize. Please see attached cause exception.  at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:471)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:62)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:96)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:245)
> ~[neo4j-kernel-1.9.M03.jar:na]    at
> org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:88)
> ~[neo4j-kernel-1.9.M03.jar:na]    at
> org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:83)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] Caused by:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> 'org.neo4j.kernel.logging.LogbackService$1@1955bd61' was successfully
> initialized, but failed to start. Please see attached cause exception.
>   at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:495)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:105)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.logging.LogbackService.init(LogbackService.java:106)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:465)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:62)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03]   at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:96)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] Caused by:
> java.lang.NoSuchMethodError:
> org.codehaus.janino.ClassBodyEvaluator.setImplementedInterfaces([Ljava/lang/Class;)V
>   at
> ch.qos.logback.core.joran.conditional.PropertyEvalScriptBuilder.build(PropertyEvalScriptBuilder.java:48)
> ~[logback-core.jar:na]    at
> ch.qos.logback.core.joran.conditional.IfAction.begin(IfAction.java:67)
> ~[logback-core.jar:na]    at
> ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:276)
> ~[logback-core.jar:na]    at
> ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:148)
> ~[logback-core.jar:na]    at
> ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:130)
> ~[logback-core.jar:na]    at
> ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
> ~[logback-core.jar:na]

EDIT1 更多细节

我从play_2.10.jar中删除了logback.xml文件,并且不再在play应用程序启动时收到logback的重复警告。

然后,我尝试将neo4j logback.xml和play2.1 logback.xml的内容作为custom-logback.xml放置在我的play项目根目录中。与Play.application().path()相同的路径。也许这是neo4j拾取它的错误位置?

在查看依赖项时,我有一个由neo4j-server需要的janino。此外,我没有看到有关日志记录的任何冲突,但也许我漏掉了什么。以下是'play dependencies'的依赖层次结构:

https://gist.github.com/4559389

我还尝试将下面在Play2.1 wiki上列出的默认配置复制到custom-logback.xml中,但没有成功:

<configuration>

  <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>${application.home}/logs/application.log</file>
     <encoder>
       <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
     </encoder>
   </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
    </encoder>
  </appender>

  <logger name="play" level="INFO" />
  <logger name="application" level="INFO" />

  <root level="ERROR">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>

</configuration>

编辑 2

明显存在与logback依赖项有关的问题。看起来Neo4j依赖于0.9.30,而Play则依赖于1.0.7。我猜想这两个版本之间存在一个api更改,当?janino?加载库时找不到适当的方法。仍然不确定如何在logback.xml中正确指定以在运行时选择适当的依赖项。 Play2.1RC1 Logback 依赖 Neo4j Logback 依赖

图表是由yed + sbt-dependency-graph生成的。


我遇到了相同的问题... - Fynn
我也是...非常令人沮丧。 - Mikesname
@steveturner 遇到了同样的问题,正在寻找解决方法 ^^ - Mik378
4个回答

5

关于由于Play 2.1的新版logback与Neo4j不兼容而引发的Neo4j生命周期异常。 我遇到了这个问题,最终通过将Build.scala项目依赖项中的Play的logback覆盖为旧版本来解决它:

"ch.qos.logback" % "logback-core" % "1.0.3" force(), // this should override the Play version
"ch.qos.logback" % "logback-classic" % "1.0.3" force(),

为了保险起见,我也尝试通过设置SBT的ivyXML参数来排除任何被拉入的log4j传递依赖项:

ivyXML :=
  <dependencies>
    <exclude module="log4j"/>
  </dependencies>

这显然是一种脆弱的解决方案,但至少对于Play 2.1-RC2来说,它似乎有效。我仍然有问题实际上配置Neo4j的日志记录,所以我会尝试稍后更新这个答案。
更新:由于我对Logback不熟悉,我在将其与Play / Neo4j配置时遇到了一些困难。为了防止Logback出错并淹没我在状态消息中,我需要在我的Play应用程序的conf目录中放置一个名为custom-logback.xml的文件。我认为Neo4j日志记录配置需要这样做。我的文件包含以下内容:
<included>
    <logger name="eu.mypackage" level="info">
    </logger>

    <logger name="org.neo4j" level="warn">
    </logger>

    <root level="warn">
    </root>
</included>

在我的配置目录中,我似乎需要一个名为logback.properties的文件,其中(在我的情况下)仅包含以下一行:

CONSOLE_LEVEL=ERROR

(Logback专家,如有任何错误请指正。)
(请注意,此处的HTML标签已被保留。)

你从使用的jar包中删除了任何logback文件吗?我一直收到有关重复logback.xml文件的警告。一个在play_2.10/2.1-RC2/jars/play_2.10.jar!,另一个在org.neo4j.app/neo4j-server/jars/neo4j-server-1.9.M04.jar! - Fynn
@fynn:你知道吗,我想我确实从Play 2.1-RC2的jar包中删除了logback.xml。我会进行更多的调查。 - Mikesname
我可以确认,从存储库缓存中删除logback.xml Jars可以消除警告,并允许您按照@Mikesname的建议运行。 - steveturner
@Mikesname,你更愿意谈论存储库/本地而不是缓存吗?你用什么方法从jar文件中删除文件?当我删除它(提取它,压缩它并将其重命名为jar(肯定是错误的做法))时,我遇到了一个java.lang.ClassNotFoundException: play.core.server.NettyServer,当我执行play run时。 - Mik378
@Mik378: 我现在不认为从任何jar文件中删除logback配置是必要的,因为我已经在几台机器上运行了我的设置,并发现它可以正常工作,不需要任何这样的麻烦。然而,当我最初这样做时,我只是使用 file-roller GUI 应用程序(在 Linux 上)直接打开 jar 文件并重命名文件。 - Mikesname

2

您似乎遇到了两个不同的问题。首先是Play提供的logback.xml文件与Neo的冲突。其次,您的类路径上似乎有两个版本的logback,我猜测这会导致NoSuchMethodError异常。如果您可以删除Play logback.xml文件并将其内容放入名为“/ custom-logback.xml”的文件中(Neo将通过我们的logback配置包含它),然后确保您只有一个版本的Logback(或具体地说,Janino),那应该会有所帮助。


Rickard -- 请查看 https://gist.github.com/4559389 获取依赖项。我没有看到 logback 的重复,但也许我漏掉了什么。 - steveturner

1

最终,我无法解决Play 2.1、Neo4J和logback之间的依赖问题。我相信这是一个简单而快速的修复,但我不确定如何在不显式修改任何包依赖的情况下解决它。因此,我选择使用Neo4J Java REST binding暂时替换嵌入式服务器。效果很好,只有一些小问题,涉及本地API和REST封装器之间的差异。我在Build.scala中保留了嵌入式服务器的依赖关系,并将嵌入式和REST服务从公共接口中拆分出来,以便可以在运行时指定它们。我想理想情况下,这两个都应该是Play的插件...


0

这可能听起来与上面的问题描述完全无关,但是:

对我们来说 - 我在Mac上,我的同事在Ubuntu上 - 问题最终被证明是由于被拉入Play的/lib目录中不应该存在的库依赖项引起的(出于某种原因),在我们的情况下是Janino的两个版本 - 2.5.10和2.6.1,删除旧版本解决了问题。

我的同事提到了有关用于标识这两个版本的命名约定差异可能导致了问题。

因此,总之,在某些情况下,请检查/lib目录以获取非必要或意外的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接