2011-05-03 89 views
2

我已经做了一个Logging特性,它封装了日志实现的细节,它也很好,很懒,所以特别是当特定的日志级别没有激活时效率更高。scala自我感知特征

/** 
* A SLF4J based logging trait 
*/ 
trait Log { 
import org.slf4j.Logger 
import org.slf4j.LoggerFactory 

val loggedClazz: Class[_] 

lazy val logger: Logger = LoggerFactory.getLogger(loggedClazz.getClass) 

def logDebug(codeblock: => String) = { 
    if (logger.isDebugEnabled) { 
    logger.debug(codeblock) 
    } 
} 

def logError(codeblock: => String) = { 
    if (logger.isErrorEnabled) { 
    logger.error(codeblock) 
    } 
} 

def logInfo(codeblock: => String) = { 
    if (logger.isInfoEnabled) { 
    logger.info(codeblock) 
    } 
} 

def logWarn(codeblock: => String) = { 
    if (logger.isWarnEnabled) { 
    logger.warn(codeblock) 
    } 
} 
} 

但是它需要类成这种特质是混合在实现以下..

object MyServer extends Log { 
    val loggedClazz = MyServer.getClass 
} 

我的问题是,是否有可能以某种方式使特质知道成类它已被混入?不再需要做到:

val loggedClazz = MyServer.getClass 

SOLUTION:继提供反馈,我在下面的方式改写了类。

/** 
* A SLF4J based logging trait 
*/ 
trait Log { 
    import org.slf4j.Logger 
    import org.slf4j.LoggerFactory 

    lazy val logger: Logger = LoggerFactory.getLogger(getClass) 

    def logDebug(codeblock: => String) = { 
    if (logger.isDebugEnabled) { 
     logger.debug(codeblock) 
    } 
    } 

    def logError(codeblock: => String) = { 
    if (logger.isErrorEnabled) { 
     logger.error(codeblock) 
    } 
    } 

    def logInfo(codeblock: => String) = { 
    if (logger.isInfoEnabled) { 
     logger.info(codeblock) 
    } 
    } 

    def logWarn(codeblock: => String) = { 
    if (logger.isWarnEnabled) { 
     logger.warn(codeblock) 
    } 
    } 
} 

非常简单。当你做对了,第一次;)

回答

3

由于您在Class[_]对象上调用getClass,您当前的代码将无法按预期工作,因为返回的记录器将始终用于类Class[Class[_]]

使用这个代替:

lazy val logger: Logger = LoggerFactory.getLogger(getClass)

你也可以看看SLF4S,一个简单包装的SLF4J,这非常类似于你在做什么。

+0

感谢您的反馈 – 2011-05-04 15:51:48

5

你可以用val loggedClazz = getClass替换val loggedClazz: Class[_]

+0

感谢您的反馈 – 2011-05-04 15:52:01