черта самосознания Скала - PullRequest
2 голосов
/ 03 мая 2011

Я создал черту 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)
    }
  }
}

Совершенно просто. Когда вы делаете это правильно, в первый раз;)

Ответы [ 2 ]

5 голосов
/ 03 мая 2011

Вы можете заменить val loggedClazz: Class[_] на val loggedClazz = getClass.

3 голосов
/ 03 мая 2011

Ваш текущий код не будет работать должным образом, поскольку возвращаемый регистратор всегда будет для класса Class[Class[_]], поскольку вы вызываете getClass для Class[_] объекта.

Используйте это вместо:

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

Вы также можете захотеть взглянуть SLF4S , тонкую оболочку вокруг SLF4J, которая очень похожа на то, что вы делаете.

...