[英]scala self aware trait
我制作了一個 Logging trait,它封裝了日志實現的細節,它也很好而且很懶,所以特別是在特定日志級別不活動時非常有效。
/**
* 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)
}
}
}
但是,它需要混入此特征的 class 來實現以下功能。
object MyServer extends Log {
val loggedClazz = MyServer.getClass
}
我的問題是,是否有可能讓 Trait 知道它混入了哪個 class ? 無需執行以下操作:
val loggedClazz = MyServer.getClass
解決方案:根據提供的反饋,我以以下方式重寫了 class。
/**
* 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)
}
}
}
完全簡單。 當你做對了,第一次;)
您可以將val loggedClazz: Class[_]
替換為val loggedClazz = getClass
。
您當前的代碼將無法按預期工作,因為返回的記錄器將始終用於 class Class[Class[_]]
,因為您在Class[_]
object 上調用getClass
。
改用這個:
lazy val logger: Logger = LoggerFactory.getLogger(getClass)
您可能還想看看SLF4S ,一個圍繞 SLF4J 的薄包裝,它與您正在做的非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.