播放无法加载自定义日志返回appender

时间:2013-11-26 07:06:58

标签: playframework logback

我创建了一个自定义logback appender。但是play为appender提供了ClassNotFound异常。

以下是我的追加者

package log

import ch.qos.logback.core.AppenderBase
import ch.qos.logback.core.UnsynchronizedAppenderBase
import ch.qos.logback.core.spi.ContextAwareBase
import log.model.LogMessage
import data.OrganizationDao
import log.dao.LogDao
import ch.qos.logback.core.status.Status

class MongoAppender extends ContextAwareBase {
  private def add(level:Int, msg: String, ex: Throwable) = {
    val message = ex match {
      case null => LogMessage(None, level, msg, null, null, new Array[String](0))
      case _ => LogMessage(None, level, msg, ex.getClass().getName(), ex.getMessage(), new Array[String](0))
    }

    LogDao.save(message)

  }
  override def addStatus(status:Status) = {
    add(status.getLevel(), status.getMessage(), status.getThrowable())
  }

}

以下是我的logger.xml

<configuration>

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

    <appender name="Mongo" class="log.MongoAppender">

    </appender>



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

    <root level="ERROR">
        <appender-ref ref="Mongo" />
    </root>

</configuration>

我得到以下stacktrace

Caused by: java.lang.ClassNotFoundException: log.MongoAppender
        at      at java.net.URLClassLoader$1.run(Unknown Source)
        at      at java.net.URLClassLoader$1.run(Unknown Source)
        at      at java.security.AccessController.doPrivileged(Native Method)
        at      at java.net.URLClassLoader.findClass(Unknown Source)
        at      at java.lang.ClassLoader.loadClass(Unknown Source)
        at      at java.lang.ClassLoader.loadClass(Unknown Source)
        at      at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameA
ndParameter(OptionHelper.java:60)

我已经检查过appender类是否编译并检查了编译后的字节代码。为什么不玩捡起来?

2 个答案:

答案 0 :(得分:13)

似乎在dev模式下play的动态编译类不可用于logback。我正在努力解决同样的问题。将我的自定义appender放到一个单独的jar文件中对我有用。我假设在prod中使用暂存的最终jar文件,这应该不是问题。

答案 1 :(得分:1)

虽然添加单独的jar文件的解决方案有效,但我找到了另一种解决方案,它增加了访问你的app.conf文件中定义的uri的好处。

在您的模块中创建EagerSingleton。这将在启动期间调用。在此内部,构建MongoDB Appender并将其添加到要记录到MongoDB的记录器中。好处是您可以将配置注入此单例,然后访问配置设置以传递给MongoDB Appender。