2013-11-26 30 views
12

我已經創建了自定義logback appender。但是play會給appender一個ClassNotFound異常。播放未能加載自定義日誌返回appender

以下是我的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()) 
    } 

} 

以下是我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> 

我正在以下堆棧跟蹤

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) 

我已簽了附加器類不編譯並檢查編譯的字節碼。爲什麼不玩它呢?

+0

同樣的問題給我... – Antonin

回答

9

看來,在dev模式下play的動態編譯類不能用於logback。我正在努力解決同樣的問題。把我的自定義appender到一個單獨的jar文件適用於我。我假設在階段性的最終jar文件中,這應該不成問題。

+0

謝謝agabor,似乎是要走的路嗎?你能提供一些關於怎麼做的細節嗎? – Antonin

+0

基本思想是,您爲自定義記錄器創建獨立項目,並將其用作Play項目的依賴項。由於這是一個老問題,我不確定它是否仍然是最新Play版本的問題。即使它有可能是另一種解決方法。 – agabor

+0

謝謝agabor,我會嘗試。這仍然是當前播放版本(2.5.x)的一個問題, – Antonin

1

儘管添加單獨的jar文件的解決方案有效,但我發現了另一個解決方案,它增加了訪問您的uri的好處,如application.conf文件中定義的。

在您的模塊中創建一個EagerSingleton。這將在啓動過程中被調用。在這裏面,構建您的MongoDB Appender並將其添加到您想要登錄到MongoDB的記錄器中。好處是你可以將你的配置注入到這個單例中,然後訪問配置設置傳遞給你的MongoDB Appender。