Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play fails to load custom log back appender

I have created a custom logback appender. But play gives a ClassNotFound exception for the appender.

Following is my appender

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())
  }

}

The following is my 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>

I am getting the following 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)

I have checked that the appender class does compile and also checked the compiled byte code. Why does not play pick it up?

like image 284
user2833557 Avatar asked Nov 26 '13 07:11

user2833557


1 Answers

It seems that play's dynamically compiled classes in dev mode are not available for logback. I'm struggling with the same issue. Putting my custom appender to a separate jar file works for me. I assume in prod with staged final jar files this should not be a problem.

like image 81
agabor Avatar answered Oct 11 '22 16:10

agabor