我已经制作了一个Logging特性,它封装了日志记录实现的细节,它既漂亮又懒惰,所以特别是在特定日志级别不活动时效率很高。
/**
* 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
}
我的问题是,是否有可能以某种方式使Trait知道它被混入哪个类?无需执行:
val loggedClazz = MyServer.getClass
解决方案:根据提供的反馈,我按以下方式重写了课程。
/**
* 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)
}
}
}
完全简单。当你做对了,第一次;)
答案 0 :(得分:5)
您可以将val loggedClazz: Class[_]
替换为val loggedClazz = getClass
。
答案 1 :(得分:3)
您当前的代码无法按预期工作,因为您在Class[Class[_]]
对象上调用getClass
,因此返回的记录器始终用于课程Class[_]
。
请改用:
lazy val logger: Logger = LoggerFactory.getLogger(getClass)
你可能还想看看SLF4S,一个围绕SLF4J的薄包装,这与你正在做的非常相似。