From 4c2c5e5c85581b21209a4e1bc64aa15d04185be9 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 20 Aug 2022 04:32:43 +0000 Subject: [PATCH 1/7] Use `UUIDGen` instead of `randomUUID()` --- build.sbt | 8 +--- .../PagingSelfAwareStructuredLogger.scala | 47 ++++++++++++------- ...gSelfAwareStructuredLoggerTestRunner.scala | 4 +- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/build.sbt b/build.sbt index 7d6babd8..b7f90ebb 100644 --- a/build.sbt +++ b/build.sbt @@ -46,18 +46,14 @@ lazy val core = crossProject(JSPlatform, JVMPlatform) .settings( name := "log4cats-core", libraryDependencies ++= Seq( - "org.typelevel" %%% "cats-core" % catsV + "org.typelevel" %%% "cats-core" % catsV, + "org.typelevel" %%% "cats-effect-std" % catsEffectV ), libraryDependencies ++= { if (tlIsScala3.value) Seq.empty else Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided) } ) - .jsSettings( - // https://www.scala-js.org/news/2022/04/04/announcing-scalajs-1.10.0#fixes-with-compatibility-concerns - libraryDependencies += ("org.scala-js" %%% "scalajs-java-securerandom" % "1.0.0") - .cross(CrossVersion.for3Use2_13) - ) lazy val testing = crossProject(JSPlatform, JVMPlatform) .settings(commonSettings) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala index f55a00e9..a025894c 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala @@ -17,7 +17,8 @@ package org.typelevel.log4cats import cats._ -import cats.implicits._ +import cats.effect.std.UUIDGen +import cats.syntax.all._ import java.io.{PrintWriter, StringWriter} import java.util.UUID @@ -52,12 +53,26 @@ object PagingSelfAwareStructuredLogger { * @return * SelfAwareStructuredLogger with pagination. */ - def withPaging[F[_]: Monad](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( + def withPaging2[F[_]: Monad: UUIDGen](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( logger: SelfAwareStructuredLogger[F] ): SelfAwareStructuredLogger[F] = - new PagingSelfAwareStructuredLogger[F](pageSizeK, maxPageNeeded)(logger) + new PagingSelfAwareStructuredLogger[F](pageSizeK, maxPageNeeded, UUIDGen.randomUUID)(logger) - private class PagingSelfAwareStructuredLogger[F[_]: Monad](pageSizeK: Int, maxPageNeeded: Int)( + @deprecated("Use withPaging2", "2.5.0") + def withPaging[F[_]: Monad](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( + logger: SelfAwareStructuredLogger[F] + ): SelfAwareStructuredLogger[F] = + new PagingSelfAwareStructuredLogger[F]( + pageSizeK, + maxPageNeeded, + Monad[F].unit.map(_ => UUID.randomUUID()) + )(logger) + + private class PagingSelfAwareStructuredLogger[F[_]: Monad]( + pageSizeK: Int, + maxPageNeeded: Int, + randomUUID: F[UUID] + )( sl: SelfAwareStructuredLogger[F] ) extends SelfAwareStructuredLogger[F] { if (pageSizeK <= 0 || maxPageNeeded <= 0) @@ -100,16 +115,17 @@ object PagingSelfAwareStructuredLogger { private def addCtx( msg: => String, ctx: Map[String, String] - ): (String, Map[String, String]) = { - val logSplitId = UUID.randomUUID().show - ( - logSplitId, - ctx - .updated(logSplitIdN, logSplitId) - .updated("page_size", s"${pageSizeK.show} Kib") - .updated("log_size", s"${msg.length.show} Byte") - ) - } + ): F[(String, Map[String, String])] = + randomUUID.map { uuid => + val logSplitId = uuid.show + ( + logSplitId, + ctx + .updated(logSplitIdN, logSplitId) + .updated("page_size", s"${pageSizeK.show} Kib") + .updated("log_size", s"${msg.length.show} Byte") + ) + } private def doLogging( loggingLevelChk: => F[Boolean], @@ -118,8 +134,7 @@ object PagingSelfAwareStructuredLogger { ctx: Map[String, String] = Map() ): F[Unit] = { loggingLevelChk.ifM( - { - val (logSplitId, newCtx) = addCtx(msg, ctx) + addCtx(msg, ctx).flatMap { case (logSplitId, newCtx) => pagedLogging(logOpWithCtx(newCtx), logSplitId, msg) }, Applicative[F].unit diff --git a/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala b/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala index 099ee1ee..cfa4d4c1 100644 --- a/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala +++ b/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala @@ -44,7 +44,7 @@ class PagingSelfAwareStructuredLoggerTestRunner extends CatsEffectSuite { val pageSize = pageSizeK * 1024 val stl = StructuredTestingLogger.impl[IO]() val pagingStl: SelfAwareStructuredLogger[IO] = - PagingSelfAwareStructuredLogger.withPaging[IO](pageSizeK, maxPageNeeded)(stl) + PagingSelfAwareStructuredLogger.withPaging2[IO](pageSizeK, maxPageNeeded)(stl) val logResult: IO[Unit] = logTest(pagingStl) val test = logResult >> stl.logged @@ -103,7 +103,7 @@ class PagingSelfAwareStructuredLoggerTestRunner extends CatsEffectSuite { ): Unit = { val stl = StructuredTestingLogger.impl[IO]() try { - PagingSelfAwareStructuredLogger.withPaging[IO](pageSizeK, maxPageNeeded)(stl) + PagingSelfAwareStructuredLogger.withPaging2[IO](pageSizeK, maxPageNeeded)(stl) fail(s"$suiteName $caseName: Expected exception not thrown") } catch { case thr: Throwable => assert(thr.isInstanceOf[IllegalArgumentException]) From dcd92038b09778df9eb935b607d928a23d6f48fc Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 20 Aug 2022 04:37:38 +0000 Subject: [PATCH 2/7] Formatting --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index b7f90ebb..9dcaaef1 100644 --- a/build.sbt +++ b/build.sbt @@ -46,7 +46,7 @@ lazy val core = crossProject(JSPlatform, JVMPlatform) .settings( name := "log4cats-core", libraryDependencies ++= Seq( - "org.typelevel" %%% "cats-core" % catsV, + "org.typelevel" %%% "cats-core" % catsV, "org.typelevel" %%% "cats-effect-std" % catsEffectV ), libraryDependencies ++= { From 48841c9b40761a851df1b47a41a2ce8e5a09fd41 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 20 Aug 2022 04:37:54 +0000 Subject: [PATCH 3/7] Bump base version --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 9dcaaef1..993e2ae8 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ val Scala213 = "2.13.8" val Scala212 = "2.12.16" val Scala3 = "3.1.3" -ThisBuild / tlBaseVersion := "2.4" +ThisBuild / tlBaseVersion := "2.5" ThisBuild / crossScalaVersions := Seq(Scala213, Scala212, Scala3) ThisBuild / scalaVersion := Scala213 ThisBuild / startYear := Some(2018) From fefa49d6fbacca5ad0a1a259916a3870d907d410 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 20 Aug 2022 04:41:49 +0000 Subject: [PATCH 4/7] Bincompat --- .../log4cats/PagingSelfAwareStructuredLogger.scala | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala index a025894c..927ca0d2 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala @@ -62,11 +62,7 @@ object PagingSelfAwareStructuredLogger { def withPaging[F[_]: Monad](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( logger: SelfAwareStructuredLogger[F] ): SelfAwareStructuredLogger[F] = - new PagingSelfAwareStructuredLogger[F]( - pageSizeK, - maxPageNeeded, - Monad[F].unit.map(_ => UUID.randomUUID()) - )(logger) + new PagingSelfAwareStructuredLogger[F](pageSizeK, maxPageNeeded)(logger) private class PagingSelfAwareStructuredLogger[F[_]: Monad]( pageSizeK: Int, @@ -80,6 +76,12 @@ object PagingSelfAwareStructuredLogger { s"pageSizeK(=$pageSizeK) and maxPageNeeded(=$maxPageNeeded) must be positive numbers." ) + @deprecated("Use constructor with randomUUID", "2.5.0") + def this(pageSizeK: Int, maxPageNeeded: Int)( + sl: SelfAwareStructuredLogger[F] + ) = + this(pageSizeK, maxPageNeeded, Monad[F].unit.map(_ => UUID.randomUUID()))(sl) + private val pageIndices = (1 to maxPageNeeded).toList private val logSplitIdN = "log_split_id" private val pageSize = pageSizeK * 1024 From eb768c06f9fcca236e737f5c505f82d4a71b8846 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 20 Aug 2022 07:02:17 +0000 Subject: [PATCH 5/7] `withPaging2` -> `paged` --- .../typelevel/log4cats/PagingSelfAwareStructuredLogger.scala | 4 ++-- .../log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala index 927ca0d2..300f9280 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLogger.scala @@ -53,12 +53,12 @@ object PagingSelfAwareStructuredLogger { * @return * SelfAwareStructuredLogger with pagination. */ - def withPaging2[F[_]: Monad: UUIDGen](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( + def paged[F[_]: Monad: UUIDGen](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( logger: SelfAwareStructuredLogger[F] ): SelfAwareStructuredLogger[F] = new PagingSelfAwareStructuredLogger[F](pageSizeK, maxPageNeeded, UUIDGen.randomUUID)(logger) - @deprecated("Use withPaging2", "2.5.0") + @deprecated("Use paged", "2.5.0") def withPaging[F[_]: Monad](pageSizeK: Int = 64, maxPageNeeded: Int = 999)( logger: SelfAwareStructuredLogger[F] ): SelfAwareStructuredLogger[F] = diff --git a/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala b/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala index cfa4d4c1..bcd246b3 100644 --- a/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala +++ b/testing/shared/src/test/scala/org/typelevel/log4cats/PagingSelfAwareStructuredLoggerTestRunner.scala @@ -44,7 +44,7 @@ class PagingSelfAwareStructuredLoggerTestRunner extends CatsEffectSuite { val pageSize = pageSizeK * 1024 val stl = StructuredTestingLogger.impl[IO]() val pagingStl: SelfAwareStructuredLogger[IO] = - PagingSelfAwareStructuredLogger.withPaging2[IO](pageSizeK, maxPageNeeded)(stl) + PagingSelfAwareStructuredLogger.paged[IO](pageSizeK, maxPageNeeded)(stl) val logResult: IO[Unit] = logTest(pagingStl) val test = logResult >> stl.logged @@ -103,7 +103,7 @@ class PagingSelfAwareStructuredLoggerTestRunner extends CatsEffectSuite { ): Unit = { val stl = StructuredTestingLogger.impl[IO]() try { - PagingSelfAwareStructuredLogger.withPaging2[IO](pageSizeK, maxPageNeeded)(stl) + PagingSelfAwareStructuredLogger.paged[IO](pageSizeK, maxPageNeeded)(stl) fail(s"$suiteName $caseName: Expected exception not thrown") } catch { case thr: Throwable => assert(thr.isInstanceOf[IllegalArgumentException]) From a595fcf412d17567f0ddf2c086eea037bd387f62 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Fri, 9 Sep 2022 22:30:49 +0000 Subject: [PATCH 6/7] Cross-build for Native --- .github/workflows/ci.yml | 42 +++++++++++++++++++++++++++++++++++++--- build.sbt | 19 ++++++++++++------ project/plugins.sbt | 6 ++++-- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e06824ef..8b0b1c85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: os: [ubuntu-latest] scala: [2.13.8, 2.12.16, 3.1.3] java: [temurin@8, temurin@11] - project: [rootJS, rootJVM] + project: [rootJS, rootJVM, rootNative] exclude: - scala: 2.12.16 java: temurin@11 @@ -38,6 +38,8 @@ jobs: java: temurin@11 - project: rootJS java: temurin@11 + - project: rootNative + java: temurin@11 runs-on: ${{ matrix.os }} steps: - name: Checkout current branch (full) @@ -100,6 +102,10 @@ jobs: if: matrix.project == 'rootJS' run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' Test/scalaJSLinkerResult + - name: nativeLink + if: matrix.project == 'rootNative' + run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' Test/nativeLink + - name: Test run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' test @@ -113,11 +119,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p testing/jvm/target noop/jvm/target target .js/target site/target core/js/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target + run: mkdir -p testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target noop/native/target core/js/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar testing/jvm/target noop/jvm/target target .js/target site/target core/js/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target + run: tar cf targets.tar testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target noop/native/target core/js/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') @@ -206,6 +212,16 @@ jobs: tar xf targets.tar rm targets.tar + - name: Download target directories (2.13.8, rootNative) + uses: actions/download-artifact@v2 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.8-rootNative + + - name: Inflate target directories (2.13.8, rootNative) + run: | + tar xf targets.tar + rm targets.tar + - name: Download target directories (2.12.16, rootJS) uses: actions/download-artifact@v2 with: @@ -226,6 +242,16 @@ jobs: tar xf targets.tar rm targets.tar + - name: Download target directories (2.12.16, rootNative) + uses: actions/download-artifact@v2 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.16-rootNative + + - name: Inflate target directories (2.12.16, rootNative) + run: | + tar xf targets.tar + rm targets.tar + - name: Download target directories (3.1.3, rootJS) uses: actions/download-artifact@v2 with: @@ -246,6 +272,16 @@ jobs: tar xf targets.tar rm targets.tar + - name: Download target directories (3.1.3, rootNative) + uses: actions/download-artifact@v2 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-3.1.3-rootNative + + - name: Inflate target directories (3.1.3, rootNative) + run: | + tar xf targets.tar + rm targets.tar + - name: Import signing key if: env.PGP_SECRET != '' && env.PGP_PASSPHRASE == '' run: echo $PGP_SECRET | base64 -di | gpg --import diff --git a/build.sbt b/build.sbt index 993e2ae8..8c12384d 100644 --- a/build.sbt +++ b/build.sbt @@ -27,9 +27,9 @@ ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8"), JavaSpec.te ThisBuild / tlVersionIntroduced := Map("3" -> "2.1.1") val catsV = "2.8.0" -val catsEffectV = "3.3.14" +val catsEffectV = "3.3.14-1-5d11fe9" val slf4jV = "1.7.36" -val munitCatsEffectV = "1.0.7" +val munitCatsEffectV = "2.0-5e03bfc" val logbackClassicV = "1.2.11" Global / onChangedBuildSource := ReloadOnSourceChanges @@ -41,7 +41,7 @@ lazy val docs = project .enablePlugins(TypelevelSitePlugin) .dependsOn(slf4j) -lazy val core = crossProject(JSPlatform, JVMPlatform) +lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform) .settings(commonSettings) .settings( name := "log4cats-core", @@ -54,8 +54,9 @@ lazy val core = crossProject(JSPlatform, JVMPlatform) else Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided) } ) + .nativeSettings(commonNativeSettings) -lazy val testing = crossProject(JSPlatform, JVMPlatform) +lazy val testing = crossProject(JSPlatform, JVMPlatform, NativePlatform) .settings(commonSettings) .dependsOn(core) .settings( @@ -65,13 +66,15 @@ lazy val testing = crossProject(JSPlatform, JVMPlatform) "ch.qos.logback" % "logback-classic" % logbackClassicV % Test ) ) + .nativeSettings(commonNativeSettings) -lazy val noop = crossProject(JSPlatform, JVMPlatform) +lazy val noop = crossProject(JSPlatform, JVMPlatform, NativePlatform) .settings(commonSettings) .dependsOn(core) .settings( name := "log4cats-noop" ) + .nativeSettings(commonNativeSettings) lazy val slf4j = project .settings(commonSettings) @@ -91,6 +94,10 @@ lazy val slf4j = project lazy val commonSettings = Seq( libraryDependencies ++= Seq( - "org.typelevel" %%% "munit-cats-effect-3" % munitCatsEffectV % Test + "org.typelevel" %%% "munit-cats-effect" % munitCatsEffectV % Test ) ) + +lazy val commonNativeSettings = Seq( + tlVersionIntroduced := List("2.12", "2.13", "3").map(_ -> "2.4.1").toMap +) diff --git a/project/plugins.sbt b/project/plugins.sbt index 70063b23..c121c94f 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,7 @@ -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.10.1") -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.3") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.10.1") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.7") +addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.2.0") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.3") val sbtTypelevelVersion = "0.4.13" addSbtPlugin("org.typelevel" % "sbt-typelevel" % sbtTypelevelVersion) addSbtPlugin("org.typelevel" % "sbt-typelevel-site" % sbtTypelevelVersion) From 9f9c5f636555e1fbef110ce190ef50d5073e84ae Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Wed, 14 Sep 2022 16:43:20 -0700 Subject: [PATCH 7/7] Version bumps --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 8c12384d..d6e300d1 100644 --- a/build.sbt +++ b/build.sbt @@ -27,9 +27,9 @@ ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8"), JavaSpec.te ThisBuild / tlVersionIntroduced := Map("3" -> "2.1.1") val catsV = "2.8.0" -val catsEffectV = "3.3.14-1-5d11fe9" +val catsEffectV = "3.3.14" val slf4jV = "1.7.36" -val munitCatsEffectV = "2.0-5e03bfc" +val munitCatsEffectV = "2.0.0-M3" val logbackClassicV = "1.2.11" Global / onChangedBuildSource := ReloadOnSourceChanges