Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to ZIO 2.0.0-RC2 #408

Merged
merged 2 commits into from
Feb 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
96 changes: 82 additions & 14 deletions core/jvm/src/test/scala/zio/logging/LogFormatSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,50 @@ 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)
}
},
test("level") {
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)
}
},
test("levelSyslog") {
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)
}
},
Expand All @@ -41,7 +68,8 @@ object LogFormatSpec extends DefaultRunnableSpec {
() => "",
Map.empty,
Nil,
ZTraceElement.empty
ZTraceElement.empty,
Map.empty
)
assertTrue(result == s"zio-fiber-$seq")
}
Expand All @@ -54,9 +82,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")
}
Expand All @@ -71,7 +100,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")
}
Expand All @@ -83,39 +113,76 @@ 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")
}
},
test("spaced") {
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")
}
},
test("colored") {
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)
}
},
Expand All @@ -129,7 +196,8 @@ object LogFormatSpec extends DefaultRunnableSpec {
() => line,
Map.empty,
Nil,
ZTraceElement.empty
ZTraceElement.empty,
Map.empty
)
assertTrue(result.size == 10)
}
Expand Down
60 changes: 29 additions & 31 deletions core/shared/src/main/scala/zio/logging/LogFormat.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

/**
Expand Down Expand Up @@ -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) {
Expand All @@ -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)
}

Expand Down Expand Up @@ -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()
Expand All @@ -138,7 +139,8 @@ trait LogFormat { self =>
message,
context,
spans,
location
location,
annotations
)
builder.toString()
}
Expand All @@ -165,7 +167,8 @@ object LogFormat {
() => String,
Map[ZFiberRef.Runtime[_], AnyRef],
List[LogSpan],
ZTraceElement
ZTraceElement,
Map[String, String]
) => Any
): LogFormat = (builder: LogAppender) =>
(
Expand All @@ -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 =>
Expand All @@ -215,40 +213,40 @@ 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")
}
}

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()
}

Expand All @@ -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)
}

Expand Down
20 changes: 0 additions & 20 deletions core/shared/src/main/scala/zio/logging/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
Loading