package example import com.typesafe.scalalogging._ import org.slf4j.MDC import sourcecode._ object Main extends App with PosLogging { new Foo().doStuff() logger.info("Hello from main") } class Foo extends PosLogging { def doStuff(): Unit = { logger.info("Hi from Foo") } } trait PosLogging { protected val logger: LoggerTakingImplicit[PosLogging.Pos] = Logger.takingImplicit(getClass)(PosLogging.CanLogPos) } object PosLogging { /** Simple wrapper to get both Enclosing and Line */ final case class Pos(enclosing: Enclosing, line: Line) { def value = s"${enclosing.value}:${line.value}" } object Pos { implicit def generate(implicit enclosing: Enclosing, line: Line): Pos = Pos(enclosing, line) } implicit case object CanLogPos extends CanLog[Pos] { override def logMessage(originalMsg: String, pos: Pos): String = { MDC.put("pos", pos.value) originalMsg } } }