【问题标题】:Play 2.1 and Neo4J WrappingNeoServer errors with Logback.xml使用 Logback.xml 播放 2.1 和 Neo4J WrappingNeoServer 错误
【发布时间】:2013-01-17 06:00:51
【问题描述】:

我有一个带有管理控制台的嵌入式 neo4j 服务器,它在 Play 2.0.1 应用程序中工作。我最近升级到与 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.

我尝试从添加了 neo4j-server 的 Build.scala 中删除 slf4j 和 logback 依赖项,但无济于事。似乎 Neo4j 正在加载错误的 logback.xml。此外,如果我将 notTransitive() 添加到 neo4j-server 依赖项中,启动时的 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 文件,并且在播放应用程序启动时不再从 logback 中收到重复警告。

然后我尝试将 neo4j logback.xml play2.1 logback.xml 的内容作为 custom-logback.xml 放在我的 play 项目的根目录中。和 Play.application().path() 一样的路径 或许这是neo4j捡错的位置吧?

在查看依赖项时,我有一个 neo4j-server 所需的 janino。此外,我没有看到用于记录的 jar 中的任何冲突,但也许我遗漏了一些东西。这是我的“播放依赖项”的依赖层次结构:

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。我猜当库被 ?janino? 加载时,这些版本之间存在 api 变化。它找不到合适的方法。仍然不确定如何在 logback.xml 中正确指定以在运行时选择正确的依赖项。

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

【问题讨论】:

  • 我也遇到了同样的问题...
  • 我也是...非常沮丧。
  • @steveturner 前面同一个问题,找一根绳子^^

标签: neo4j slf4j logback playframework-2.1


【解决方案1】:

关于由于 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>

同样在我的 conf 目录中,我似乎需要一个名为 logback.properties 的文件(在我的例子中)只包含这一行:

CONSOLE_LEVEL=ERROR

(Logback 专家,请随时纠正任何问题。)

【讨论】:

  • 您是否从使用的 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:你知道我想我确实从 Play 2.1-RC2 jar 中删除了 logback.xml 来想想它。我会做更多调查。
  • 我可以确认,从存储库缓存中删除 logback.xml jar 确实可以消除警告并允许您按照上面的 @Mikesname 建议运行。
  • @Mikesname 你宁愿谈论存储库/本地而不是缓存吗?您用来从 jar 中删除文件的方式是什么?当我删除它(提取它,压缩它并重命名为 jar(肯定是错误的做法))时,我在玩运行时遇到了 java.lang.ClassNotFoundException: play.core.server.NettyServer
  • @Mik378:我现在认为没有必要从任何 jar 中删除 logback 配置,因为我已经在几台机器上运行了我的设置,发现它可以正常工作,没有任何这样的混乱。然而,当我最初这样做时,我只是使用 file-roller GUI 应用程序(在 Linux 上)直接打开 jar 并重命名文件。
【解决方案2】:

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

【讨论】:

  • Rickard -- 请参阅gist.github.com/4559389 了解依赖项。我没有看到 logback 的副本,但也许我遗漏了一些东西。
【解决方案3】:

最终我无法解决 Play 2.1、Neo4J 和 logback 之间的依赖问题。我确信它是一个简单快捷的修复,但我不确定如何在不明确修改任何一个包依赖项的情况下进行操作。相反,我暂时选择使用Neo4J Java REST binding 来替换嵌入式服务器。运行良好,并且在原生 API 和 REST 包装器之间存在一些小问题。我将嵌入式服务器的依赖项留在了 Build.scala 中,并将嵌入式和 REST 服务从一个公共接口中分离出来,以便可以在运行时指定它们。我想理想情况下,这两个都应该是 Play 的插件......

【讨论】:

    【解决方案4】:

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

    我们的问题 - 我在 Mac 上,我在 Ubuntu 上的同事 - 原来是库依赖项被拉到 Play 的 /lib 目录中,而该目录不应该存在(无论出于何种原因),在我们的例子中是 Janino 的两个版本 - 2.5.10 和 2.6.1,删除旧版本解决了问题。

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

    总结一下;在某些情况下,请检查您的 /lib 目录中是否存在非必要或意外的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多