diff --git a/build.sbt b/build.sbt index 81677b3..1d24c93 100644 --- a/build.sbt +++ b/build.sbt @@ -13,6 +13,7 @@ crossScalaVersions := Seq( "2.9.0-1", "2.9.1") + libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.6.1") diff --git a/src/main/scala/Logging.scala b/src/main/scala/Logging.scala index c3dfab1..d0d416b 100644 --- a/src/main/scala/Logging.scala +++ b/src/main/scala/Logging.scala @@ -23,5 +23,5 @@ trait Logging { /** * Logger for the type mixed into. */ - protected[slf4s] lazy val logger = Logger(this.getClass) + protected[slf4s] implicit lazy val logger = Logger(this.getClass) } diff --git a/src/main/scala/LoggingUtilities.scala b/src/main/scala/LoggingUtilities.scala new file mode 100644 index 0000000..87edfb9 --- /dev/null +++ b/src/main/scala/LoggingUtilities.scala @@ -0,0 +1,45 @@ +package com.weiglewilczek.slf4s + +/* + * A mixin with logging utilities. + */ +trait LoggingUtilities { + implicit def wrapAny[A](value: A) = new AnyWrapper(value) + + class AnyWrapper[A](value: A) { + + /** + * This is a logging version of Kestrel combinator. + * + * This method is very similar to Object#tap method in Ruby. It prints the given message along with the object + * on which the method was invoked, and evaluates to the same object. It is used to tap into method chains, in + * in order to inspect the values of object at various stages in processing. + * + * Example: + * List.range(1, 10).trace("Original") + * .map(2 *).trace("After mapping") + * .filter(4 <).trace("After filtering") + * .size.trace("Size") + * + * The default logging method invoked is Logger#debug. It is easy to invoke other logging methods instead, if + * so required. + * + * Example: + * List.range(1, 10).trace("Original", _.info) + * + * @param message The message to be logged along with the object value. + * @param logFn The logging method to use. By default, set to Logger#debug. + * @param logger The logger to use for logging. + * @return The object on which the method was invoked. + */ + def trace(message: => String, logFn: Logger => (=> String) => Unit = _.debug)(implicit logger: Logger): A = { + logFn(logger)(message + ": " + value) + value + } + } +} + +/* + * A first class module that provides logging utilities. + */ +object LoggingUtilities extends LoggingUtilities \ No newline at end of file