From 95af07af259dd1c80963d85505b11696f0480171 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Tue, 1 Feb 2022 12:49:07 -0800 Subject: [PATCH 1/2] upgrade zio version --- build.sbt | 2 +- .../scala/zio/logging/LogFormatSpec.scala | 33 +++++----- .../main/scala/zio/logging/LogFormat.scala | 60 +++++++++---------- .../src/main/scala/zio/logging/package.scala | 20 ------- .../main/scala/zio/logging/slf4j/SLF4J.scala | 22 ++++--- 5 files changed, 59 insertions(+), 78 deletions(-) diff --git a/build.sbt b/build.sbt index 2d37e6b2..66a46932 100644 --- a/build.sbt +++ b/build.sbt @@ -20,7 +20,7 @@ inThisBuild( ) ) -val ZioVersion = "2.0.0-RC1" +val ZioVersion = "2.0.0-RC2" val scalaJavaTimeVersion = "2.3.0" val slf4jVersion = "1.7.35" diff --git a/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala b/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala index 190b76cf..2c853d61 100644 --- a/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala +++ b/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala @@ -11,7 +11,7 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty) + .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == line) } }, @@ -19,7 +19,7 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = level check(Gen.elements(LogLevel.Info, LogLevel.Warning, LogLevel.Error, LogLevel.Debug)) { level => val result = - format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty) + format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == level.label) } }, @@ -27,7 +27,7 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = levelSyslog check(Gen.elements(LogLevel.Info, LogLevel.Warning, LogLevel.Error, LogLevel.Debug)) { level => val result = - format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty) + format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == level.syslog.toString) } }, @@ -41,7 +41,8 @@ object LogFormatSpec extends DefaultRunnableSpec { () => "", Map.empty, Nil, - ZTraceElement.empty + ZTraceElement.empty, + Map.empty ) assertTrue(result == s"zio-fiber-$seq") } @@ -54,9 +55,10 @@ object LogFormatSpec extends DefaultRunnableSpec { FiberId.None, LogLevel.Info, () => "", - Map(logAnnotation -> Map("test" -> annotationValue)), + Map.empty, Nil, - ZTraceElement.empty + ZTraceElement.empty, + Map("test" -> annotationValue) ) assertTrue(result == s"test=$annotationValue") } @@ -71,7 +73,8 @@ object LogFormatSpec extends DefaultRunnableSpec { () => "", Map(logContext -> LogContext.empty.annotate(LogAnnotation.UserId, annotationValue)), Nil, - ZTraceElement.empty + ZTraceElement.empty, + Map.empty ) assertTrue(result == s"user_id=$annotationValue") } @@ -83,23 +86,24 @@ object LogFormatSpec extends DefaultRunnableSpec { FiberId.None, LogLevel.Info, () => "", - Map(logAnnotation -> Map.empty), + Map.empty, Nil, - ZTraceElement.empty + ZTraceElement.empty, + Map.empty ) assertTrue(result == "") }, test("enclosing class") { val format = enclosingClass val result = format - .toLogger(implicitly[ZTraceElement], FiberId.None, LogLevel.Info, () => "", Map.empty, Nil, ZTraceElement.empty) + .toLogger(implicitly[ZTraceElement], FiberId.None, LogLevel.Info, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == "") } @@ TestAspect.ignore, test("string concat") { val format = text("a") + line + text("c") check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty) + .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == "a" + line + "c") } }, @@ -107,7 +111,7 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line |-| text("c") check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty) + .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == line + " c") } }, @@ -115,7 +119,7 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line.color(LogColor.RED) check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty) + .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) assertTrue(result == LogColor.RED.ansi + line + LogColor.RESET.ansi) } }, @@ -129,7 +133,8 @@ object LogFormatSpec extends DefaultRunnableSpec { () => line, Map.empty, Nil, - ZTraceElement.empty + ZTraceElement.empty, + Map.empty ) assertTrue(result.size == 10) } diff --git a/core/shared/src/main/scala/zio/logging/LogFormat.scala b/core/shared/src/main/scala/zio/logging/LogFormat.scala index 00adcf3d..5d7ab466 100644 --- a/core/shared/src/main/scala/zio/logging/LogFormat.scala +++ b/core/shared/src/main/scala/zio/logging/LogFormat.scala @@ -45,9 +45,9 @@ trait LogFormat { self => * separator between them. */ final def +(other: LogFormat): LogFormat = - LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location) => - self.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location) - other.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location) + LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location, annotations) => + self.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location, annotations) + other.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location, annotations) } /** @@ -76,13 +76,13 @@ trait LogFormat { self => * destroys all structure, resulting in purely textual log output. */ final def fixed(size: Int): LogFormat = - LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location) => + LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location, annotations) => val tempBuilder = new StringBuilder val append = LogAppender.unstructured { (line: String) => tempBuilder.append(line) () } - self.unsafeFormat(append)(trace, fiberId, level, line, fiberRefs, spans, location) + self.unsafeFormat(append)(trace, fiberId, level, line, fiberRefs, spans, location, annotations) val messageSize = tempBuilder.size if (messageSize < size) { @@ -97,9 +97,9 @@ trait LogFormat { self => * log levels are colored according to the specified mapping. */ final def highlight(fn: LogLevel => LogColor): LogFormat = - LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location) => + LogFormat.make { (builder, trace, fiberId, level, line, fiberRefs, spans, location, annotations) => builder.appendText(fn(level).ansi) - try self.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location) + try self.unsafeFormat(builder)(trace, fiberId, level, line, fiberRefs, spans, location, annotations) finally builder.appendText(LogColor.RESET.ansi) } @@ -127,7 +127,8 @@ trait LogFormat { self => message: () => String, context: Map[ZFiberRef.Runtime[_], AnyRef], spans: List[LogSpan], - location: ZTraceElement + location: ZTraceElement, + annotations: Map[String, String] ) => { val builder = new StringBuilder() @@ -138,7 +139,8 @@ trait LogFormat { self => message, context, spans, - location + location, + annotations ) builder.toString() } @@ -165,7 +167,8 @@ object LogFormat { () => String, Map[ZFiberRef.Runtime[_], AnyRef], List[LogSpan], - ZTraceElement + ZTraceElement, + Map[String, String] ) => Any ): LogFormat = (builder: LogAppender) => ( @@ -175,27 +178,22 @@ object LogFormat { message: () => String, context: Map[ZFiberRef.Runtime[_], AnyRef], spans: List[LogSpan], - location: ZTraceElement + location: ZTraceElement, + annotations: Map[String, String] ) => { - format(builder, trace, fiberId, logLevel, message, context, spans, location) + format(builder, trace, fiberId, logLevel, message, context, spans, location, annotations) () } def annotation(name: String): LogFormat = - LogFormat.make { (builder, _, _, _, _, fiberRefs, _, _) => - fiberRefs - .get(logAnnotation) - .foreach { value => - val map = value.asInstanceOf[Map[String, String]] - - map.get(name).foreach { value => - builder.appendKeyValue(name, value) - } - } + LogFormat.make { (builder, _, _, _, _, _, _, _, annotations) => + annotations.get(name).foreach { value => + builder.appendKeyValue(name, value) + } } def annotation[A](ann: LogAnnotation[A]): LogFormat = - LogFormat.make { (builder, _, _, _, _, fiberRefs, _, _) => + LogFormat.make { (builder, _, _, _, _, fiberRefs, _, _, _) => fiberRefs .get(logContext) .foreach { anyRef => @@ -215,7 +213,7 @@ object LogFormat { val bracketEnd: LogFormat = text("]") val enclosingClass: LogFormat = - LogFormat.make { (builder, trace, _, _, _, _, _, _) => + LogFormat.make { (builder, trace, _, _, _, _, _, _, _) => trace match { case ZTraceElement(_, file, _) => builder.appendText(file) case _ => builder.appendText("not-available") @@ -223,32 +221,32 @@ object LogFormat { } val fiberId: LogFormat = - LogFormat.make { (builder, _, fiberId, _, _, _, _, _) => + LogFormat.make { (builder, _, fiberId, _, _, _, _, _, _) => builder.appendText(fiberId.threadName) } val level: LogFormat = - LogFormat.make { (builder, _, _, level, _, _, _, _) => + LogFormat.make { (builder, _, _, level, _, _, _, _, _) => builder.appendText(level.label) } val levelSyslog: LogFormat = - LogFormat.make { (builder, _, _, level, _, _, _, _) => + LogFormat.make { (builder, _, _, level, _, _, _, _, _) => builder.appendText(level.syslog.toString) } val line: LogFormat = - LogFormat.make { (builder, _, _, _, line, _, _, _) => + LogFormat.make { (builder, _, _, _, line, _, _, _, _) => builder.appendText(line()) } def label(label: => String, value: LogFormat): LogFormat = - LogFormat.make { (builder, trace, fiberId, logLevel, message, context, spans, location) => + LogFormat.make { (builder, trace, fiberId, logLevel, message, context, spans, location, annotations) => builder.openKey() try builder.appendText(label) finally builder.closeKeyOpenValue() - try value.unsafeFormat(builder)(trace, fiberId, logLevel, message, context, spans, location) + try value.unsafeFormat(builder)(trace, fiberId, logLevel, message, context, spans, location, annotations) finally builder.closeValue() } @@ -259,7 +257,7 @@ object LogFormat { def quoted(inner: LogFormat): LogFormat = quote + inner + quote def text(value: => String): LogFormat = - LogFormat.make { (builder, _, _, _, _, _, _, _) => + LogFormat.make { (builder, _, _, _, _, _, _, _, _) => builder.appendText(value) } diff --git a/core/shared/src/main/scala/zio/logging/package.scala b/core/shared/src/main/scala/zio/logging/package.scala index 605144d2..5e1fdcd9 100644 --- a/core/shared/src/main/scala/zio/logging/package.scala +++ b/core/shared/src/main/scala/zio/logging/package.scala @@ -20,10 +20,6 @@ import java.nio.file.Path package object logging { - // TODO: This is moved to ZIO 2 - val logAnnotation: FiberRef.Runtime[Map[String, String]] = - FiberRef.unsafeMake(Map.empty, identity, (old, newV) => old ++ newV) - /** * The [[logContext]] fiber reference is used to store typed, structured log * annotations, which can be utilized by backends to enrich log messages. @@ -44,22 +40,6 @@ package object logging { val logContext: FiberRef.Runtime[LogContext] = FiberRef.unsafeMake(LogContext.empty, identity, (old, newV) => old ++ newV) - /** - * TODO: This is moved to ZIO 2. - * - * Add annotations to log context. - * - * example of usage: - * {{{ - * ZIO.log("my message") @@ annotate("requestId" -> UUID.random.toString) - * }}} - */ - def annotate(annotations: (String, String)*): ZIOAspect[Nothing, Any, Nothing, Any, Nothing, Any] = - new ZIOAspect[Nothing, Any, Nothing, Any, Nothing, Any] { - def apply[R, E, A](zio: ZIO[R, E, A])(implicit trace: ZTraceElement): ZIO[R, E, A] = - logAnnotation.get.flatMap(old => logAnnotation.locally(old ++ annotations.toMap)(zio)) - } - def console( format: LogFormat = LogFormat.colored, logLevel: LogLevel = LogLevel.Info diff --git a/slf4j/src/main/scala/zio/logging/slf4j/SLF4J.scala b/slf4j/src/main/scala/zio/logging/slf4j/SLF4J.scala index c0c88ef4..29c9f322 100644 --- a/slf4j/src/main/scala/zio/logging/slf4j/SLF4J.scala +++ b/slf4j/src/main/scala/zio/logging/slf4j/SLF4J.scala @@ -2,7 +2,7 @@ package zio.logging.backend import com.github.ghik.silencer.silent import org.slf4j.{ LoggerFactory, MDC } -import zio.logging.{ LogFormat, logAnnotation } +import zio.logging.LogFormat import zio.{ FiberId, LogLevel, LogSpan, RuntimeConfigAspect, ZFiberRef, ZLogger, ZTraceElement } import scala.collection.JavaConverters._ @@ -43,21 +43,19 @@ object SLF4J { message: () => String, context: Map[ZFiberRef.Runtime[_], AnyRef], spans: List[LogSpan], - location: ZTraceElement + location: ZTraceElement, + annotations: Map[String, String] ): Unit = - formatLogger(trace, fiberId, logLevel, message, context, spans, location).foreach { message => + formatLogger(trace, fiberId, logLevel, message, context, spans, location, annotations).foreach { message => val slf4jLogger = LoggerFactory.getLogger(rootLoggerName(trace)) val previous = - context.get(logAnnotation) match { - case Some(annotations: Map[String, String] @unchecked) if annotations.nonEmpty => - val previous = - Some(Option(MDC.getCopyOfContextMap).getOrElse(java.util.Collections.emptyMap[String, String]())) - MDC.setContextMap(annotations.asJava: @silent("JavaConverters")) - previous - case _ => - None - } + if (annotations.nonEmpty) { + val previous = + Some(Option(MDC.getCopyOfContextMap).getOrElse(java.util.Collections.emptyMap[String, String]())) + MDC.setContextMap(annotations.asJava: @silent("JavaConverters")) + previous + } else None try logLevel match { case LogLevel.All => if (slf4jLogger.isTraceEnabled) slf4jLogger.trace(message) From 281df7d3670b42cf2461b7544cb8a12cb2d1e40d Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Tue, 1 Feb 2022 13:09:18 -0800 Subject: [PATCH 2/2] format --- .../scala/zio/logging/LogFormatSpec.scala | 77 +++++++++++++++++-- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala b/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala index 2c853d61..61cde667 100644 --- a/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala +++ b/core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala @@ -11,7 +11,16 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) + .toLogger( + ZTraceElement.empty, + FiberId.None, + LogLevel.Info, + () => line, + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == line) } }, @@ -19,7 +28,16 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = level check(Gen.elements(LogLevel.Info, LogLevel.Warning, LogLevel.Error, LogLevel.Debug)) { level => val result = - format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) + format.toLogger( + ZTraceElement.empty, + FiberId.None, + level, + () => "", + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == level.label) } }, @@ -27,7 +45,16 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = levelSyslog check(Gen.elements(LogLevel.Info, LogLevel.Warning, LogLevel.Error, LogLevel.Debug)) { level => val result = - format.toLogger(ZTraceElement.empty, FiberId.None, level, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) + format.toLogger( + ZTraceElement.empty, + FiberId.None, + level, + () => "", + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == level.syslog.toString) } }, @@ -96,14 +123,32 @@ object LogFormatSpec extends DefaultRunnableSpec { test("enclosing class") { val format = enclosingClass val result = format - .toLogger(implicitly[ZTraceElement], FiberId.None, LogLevel.Info, () => "", Map.empty, Nil, ZTraceElement.empty, Map.empty) + .toLogger( + implicitly[ZTraceElement], + FiberId.None, + LogLevel.Info, + () => "", + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == "") } @@ TestAspect.ignore, test("string concat") { val format = text("a") + line + text("c") check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) + .toLogger( + ZTraceElement.empty, + FiberId.None, + LogLevel.Info, + () => line, + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == "a" + line + "c") } }, @@ -111,7 +156,16 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line |-| text("c") check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) + .toLogger( + ZTraceElement.empty, + FiberId.None, + LogLevel.Info, + () => line, + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == line + " c") } }, @@ -119,7 +173,16 @@ object LogFormatSpec extends DefaultRunnableSpec { val format = line.color(LogColor.RED) check(Gen.string) { line => val result = format - .toLogger(ZTraceElement.empty, FiberId.None, LogLevel.Info, () => line, Map.empty, Nil, ZTraceElement.empty, Map.empty) + .toLogger( + ZTraceElement.empty, + FiberId.None, + LogLevel.Info, + () => line, + Map.empty, + Nil, + ZTraceElement.empty, + Map.empty + ) assertTrue(result == LogColor.RED.ansi + line + LogColor.RESET.ansi) } },