我通常通过 LiftWeb 中的 Loggable 包装器将 Scala 与 SLF4J 一起使用。除了仅由1 个表达式链组成的非常常见的方法外,这非常有效。
因此,如果您想将日志记录添加到这样的方法中,那么简单漂亮,没有花括号
def method1():Z = a.doX(x).doY(y).doZ()
必须变成:
def method1():Z = {
val v = a.doX(x).doY(y).doZ()
logger.info("the value is %s".format(v))
v
}
不太一样,是吗?我试着用这个来解决它:
class ChainableLoggable[T](val v:T){
def logInfo(logger:Logger, msg:String, other:Any*):T = {
logger.info(msg.format(v, other))
v
}
}
implicit def anyToChainableLogger[T](v:T):ChainableLoggable[T] = new ChainableLoggable(v)
现在我可以使用更简单的形式
def method1():Z = a.doX(x).doY(y).doZ() logInfo(logger, "the value is %s")
然而 1 个额外的对象实例化和 Any 的隐式实例化开始看起来像代码臭。
有谁知道更好的解决方案?或者也许我什至不应该为此烦恼?