我创建了一个自定义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类是否编译并检查了编译后的字节代码。为什么不玩捡起来?
答案 0 :(得分:13)
似乎在dev模式下play的动态编译类不可用于logback。我正在努力解决同样的问题。将我的自定义appender放到一个单独的jar文件中对我有用。我假设在prod中使用暂存的最终jar文件,这应该不是问题。
答案 1 :(得分:1)
虽然添加单独的jar文件的解决方案有效,但我找到了另一种解决方案,它增加了访问你的app.conf文件中定义的uri的好处。
在您的模块中创建EagerSingleton。这将在启动期间调用。在此内部,构建MongoDB Appender并将其添加到要记录到MongoDB的记录器中。好处是您可以将配置注入此单例,然后访问配置设置以传递给MongoDB Appender。