Воспроизвести ошибки 2.1 и Neo4J WrappingNeoServer с помощью Logback.xml

У меня был встроенный сервер 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
> '[email protected]' failed to
> initialize. Please see attached cause exception.

Я попытался удалить slf4j и логические зависимости из моего Build.scala, где добавлен neo4j-сервер, но безрезультатно. Кажется, что неправильный logback.xml загружается neo4j. Кроме того, если я добавляю notTransitive() к зависимости neo4j-сервера, предупреждения logback.xml при запуске уходят. Я предполагаю, что специфический log4c.xml neo4j встроен в банку (я) и вызывает проблему. Одно потенциальное решение, которое я вижу, - написать пользовательскую конфигурацию с помощью кода, но я не уверен, как это сделать. Есть предположения? Для справки, я получаю эти ошибки при запуске:

>     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 [email protected] - 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 [email protected] - Registering
> current configuration as safe fallback point

Ниже приведено полное исключение:

> play.api.UnexpectedException: Unexpected exception[RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> '[email protected]' 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
> '[email protected]' 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 '[email protected]' 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
> '[email protected]' 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 Подробнее

Я удалил файл logback.xml из play_2.10.jar и больше не получал дублирующее предупреждение из журнала при запуске приложения воспроизведения.

Затем я попытался найти содержимое как файла neo4j logback.xml, так и play2.1 logback.xml как custom-logback.xml в корне моего игрового проекта. Тот же путь, что и Play.application(). Path() Возможно, это неправильное местоположение для neo4j, чтобы поднять его?

При рассмотрении зависимостей у меня есть один janino, требуемый neo4j-сервером. Кроме того, я не вижу конфликтов в баночках для регистрации, но, возможно, я что-то пропустил. Здесь моя иерархия зависимостей от "зависимостей воспроизведения":

https://gist.github.com/4559389

Я также попытался скопировать конфигурацию по умолчанию, указанную в вики-версии Play2.1, как показано ниже в 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

Определенно кажется, что проблема связана с зависимостью журнала. Neo4j зависит от 0.9.30, и игра зависит от 1.0.7. Я предполагаю, что есть переменная api между этими версиями, когда библиотека загружается? Janino? он не может найти подходящий метод. Все еще не уверены, как правильно указать в logback.xml, чтобы выбрать правильную зависимость во время выполнения. Play2.1RC1 Logback DependencyNeo4j Logback Dependency

Графы были сгенерированы графиком зависимости yed + sbt.

Ответ 1

Что касается исключения жизненного цикла Neo4j, которое выбрасывается из-за того, что новая версия logback версии 2.1 не совместима с Neo4j. Я столкнулся с этой проблемой и закончил тем, что просто заменил Play logback на более старую совместимую версию, поместив ее в мои зависимости проекта проекта Build.scala:

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

Для хорошей меры я также попытался исключить любые переходные зависимости log4j, которые вытягивают, установив параметр SBT ivyXML:

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

Это, очевидно, хрупкое исправление, но, по крайней мере, для Play 2.1-RC2, похоже, оно работает. У меня все еще есть проблемы, которые фактически настраивают ведение журнала для Neo4j, поэтому я попробую позже обновить этот ответ.

Обновление. Поскольку я новичок в Logback, мне пришлось немного сконфигурировать его с помощью Play/Neo4j. Чтобы предотвратить ошибку Logback и заглушить меня в сообщениях о статусе, мне нужно было поместить файл с именем custom-logback.xml в мою конфигурационную директорию Play app. Я думаю, что для протокола регистрации 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

(Эксперты по журналу, не стесняйтесь исправить все это.)

Ответ 2

Кажется, вы сталкиваетесь с двумя отдельными проблемами. Во-первых, Play предоставляет файл logback.xml, который конфликтует с Neo's. Во-вторых, у вас, похоже, есть две версии logback в classpath, которые, как я предполагаю, вызывают исключение NoSuchMethodError. Если вы можете удалить файл Playlogback.xml и поместить этот контент в файл под названием "/custom-logback.xml" (который Neo будет включать через нашу конфигурацию журнала), а затем убедитесь, что у вас есть только одна версия Logback (или в частности, Janino), которые должны помочь.

Ответ 3

В конечном счете я не смог решить проблему зависимости между Play 2.1, Neo4J и logback. Я уверен, что это легко и быстро исправить, но я не уверен, как это сделать, не изменяя явно зависимости от пакета. Вместо этого я решил использовать привязку Neo4J Java REST для замены встроенного сервера. Хорошо работает и имеет только несколько незначительных икота с различиями между собственным API и оберткой REST. Я оставил зависимости для встроенного сервера в Build.scala, а также разделил встроенные и REST-сервисы с общим интерфейсом, чтобы их можно было указывать во время выполнения. Я предполагаю, что в идеале эти оба должны быть плагинами для Play...

Ответ 4

Это может показаться совершенно не связанным с описанием проблемы выше, но:

Проблема для нас - я нахожусь на Mac, мой коллега по Ubuntu, - оказалось, что зависимости библиотек отвлекаются на каталог Play/lib, который не должен был быть там (по какой-либо причине), что в нашем случае была двух версиях Janino - 2.5.10 и 2.6.1, и удаление старой версии разрешило проблему.

Мой коллега упомянул что-то о различиях в соглашениях об именах, используемых для идентификации этих двух выпусков, что могло вызвать проблему.

Итак, в резюме; в некоторых случаях проверьте свой каталог /lib для несущественных или неожиданных библиотек.