簡體   English   中英

scala 自我意識特征

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM