玩框架的logback自定义布局

问题描述 投票:13回答:2

我试图使用游戏框架2.0的logback日志记录的自定义布局类。

首先,我定义的包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 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配置的新手,所以我敢肯定,我失去了一些东西明显。谢谢您的帮助。

playframework logback
2个回答
2
投票

你所看到的问题的logback从如何使用对配置为过滤器,布局,编码器等类的类加载器茎

问题是,所有的依赖性,包括的logback,这些类的DependencyClassloader是稳定的加载,而该项目代码在ReloadableClassloader它是稳定的类加载器的一个孩子,每当项目源代码更改被丢弃加载。

由于的logback不允许通过一个定制的ClassLoader,也没有查找上下文类加载器,它会尝试在稳定的类加载器来解决项目中的类,并未能找到项目中的类。

有一个declined pull request改变这种行为的logback有evidence there are no plans改变这种行为

有两种解决方法:

  • 如果您使用的子项目把你的类变成一个子项目
  • 如果您使用的不是分项目打包类成jar文件,并将该文件jar到项目的lib/ directory

-2
投票

对于我来说,我烧了,当我的应用程序如下看到这个错误:

./activator -Dhttp.port=9000 -Dconfig.resource=local.conf -jvm-debug 9999 run

但我过去,通过使用开始,而不是运行

./activator -Dhttp.port=9000 -Dconfig.resource=local.conf -jvm-debug 9999 start

然而,这创造了另一个问题;说application.conf找不到。这并不重要,我指定的文件像这样:

-Dconfig.resource=local.conf

重命名的local.conf到application.conf后,我对记录的自定义布局类是发现和使用。

© www.soinside.com 2019 - 2024. All rights reserved.