Я создал черту 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
}
Мой вопрос: возможно ли каким-либо образом разрешить Черте знать, в какой класс она была смешана? Устранение необходимости сделать:
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)
}
}
}
Совершенно просто. Когда вы делаете это правильно, в первый раз;)