我正在尝试使用自定义布局类进行play framework 2.0 logback logging。
首先,我在包utils中定义了一个自定义布局类:
package utils;
public class MonitorLayoutForLogback extends LayoutBase<ILoggingEvent> {
...
}
在我的conf / logging.xml文件中,我把:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="utils.MonitorLayoutForLogback">
<param name="programName" value="uowVisualizer" />
<param name="serviceGroup" value="shared" />
<param name="serviceIdentifier" value="uowVisualizer" />
</layout>
</encoder>
</appender>
但是当我在游戏中运行时,例如,
play run
我明白了:
14:20:18,387 |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [layout] of type [utils.MonitorLayoutForLogback] java.lang.ClassNotFoundException: utils.M
onitorLayoutForLogback
at java.lang.ClassNotFoundException: utils.MonitorLayoutForLogback
at at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at at java.security.AccessController.doPrivileged(Native Method)
at at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at at sbt.PlayCommands$$anonfun$53$$anonfun$55$$anon$2.loadClass(PlayCommands.scala:535)
at at ch.qos.logback.core.util.Loader.loadClass(Loader.java:124)
at at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.begin(NestedComplexPropertyIA.java:100)
at at ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:276)
at at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:148)
at at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:130)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:157)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:143)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:106)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:56)
at at play.api.Logger$$anonfun$configure$8.apply(Logger.scala:248)
at at play.api.Logger$$anonfun$configure$8.apply(Logger.scala:247)
at at scala.Option.map(Option.scala:145)
at at play.api.Logger$.configure(Logger.scala:247)
at at play.api.Application$class.$init$(Application.scala:266)
所以,play无法找到我创建的布局类。如何将布局类放在类路径上?
请注意,我还尝试通过
暂存项目play clean compile stage
然后通过
启动项目target/start
从打包版本启动项目,我没有看到上面缺少的类错误。但是,我也从未看到任何输出,也没有看到构造的类。我将System.out.println语句添加到此类的每个构造函数中,如下所示,以验证是否正在构造类:
public MonitorLayoutForLogback() {
System.out.println("MonitorLayoutForLogback Constructor without arguments");
}
public MonitorLayoutForLogback(String program) {
System.out.println("MonitorLayoutForLogback Constructor with program "+program);
_program = program;
}
public MonitorLayoutForLogback(String program, String sGroup, String sid) {
System.out.println("MonitorLayoutForLogback Constructor with program "+program+" sGroup "+sGroup+" sid "+sid);
_program = program;
MonitoringInfo.setServiceGroup(sGroup);
MonitoringInfo.setServiceIdentifier(sid);
}
我是logback配置的新手,所以我确定我错过了一些明显的东西。谢谢你的帮助。
答案 0 :(得分:2)
您看到的问题源于logback如何将类加载器用于配置为过滤器,布局,编码器等的类。
问题在于,对于所有依赖项,包括重新登录,这些类均装入稳定的DependencyClassloader
中,而项目代码则装入稳定类的子级ReloadableClassloader
中加载程序,并在项目源代码更改时将其丢弃。
由于logback不允许传递自定义类加载器,也无法查找上下文类加载器,因此它尝试在稳定的类加载器中解析项目类,而找不到项目类。
有一个declined pull request可以更改登录后的行为 有evidence there are no plans可以改变这种行为
有两种解决方法:
jar
文件中,然后将该jar
文件放入项目的lib/
directory 答案 1 :(得分:-2)
对我来说,我在启动应用程序时看到了这个错误,如下所示:
./activator -Dhttp.port=9000 -Dconfig.resource=local.conf -jvm-debug 9999 run
但是我通过使用start而不是run
来解决这个问题./activator -Dhttp.port=9000 -Dconfig.resource=local.conf -jvm-debug 9999 start
然而,这又造成了另一个问题;说无法找到application.conf。我指定文件并不重要:
-Dconfig.resource=local.conf
将local.conf重命名为application.conf后,将找到并使用我的自定义日志记录类。