私は通常、LiftWebのLoggableラッパーを介してSlf4JでScalaを使用します。これは、 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からの暗黙的なオブジェクトは、コードの悪臭のように見え始めます。
誰かがより良い解決策を知っていますか?それとも私はこれを気にするべきではありませんか?