This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-connectors.git


The following commit(s) were added to refs/heads/main by this push:
     new 6431bdac5 AWS SPI Pekko HTTP, Testkit: use parameterized slf4j logging 
(#1940)
6431bdac5 is described below

commit 6431bdac5414464e57de35123e9c4ee7f2c5cf66
Author: PJ Fanning <[email protected]>
AuthorDate: Fri Sep 11 22:06:07 2026 +0100

    AWS SPI Pekko HTTP, Testkit: use parameterized slf4j logging (#1940)
    
    Motivation:
    Several slf4j log calls in main sources built their message with an
    s-interpolator, so the string was concatenated even when the level was
    disabled. slf4j can defer that formatting to the point where it knows
    the event will actually be emitted.
    
    Modification:
    Replaced the interpolated messages with `{}` placeholders and argument
    lists in PekkoHttpClient.tryCreateCustomContentType, LogCapturing and
    LogCapturingJunit4. Log output is unchanged.
    
    Result:
    No message is formatted unless the level is enabled; the debug call in
    tryCreateCustomContentType no longer builds a string on every request
    when debug logging is off.
    
    Tests:
    - sbt "aws-spi-pekko-http/compile" "s3/compile" "testkit/compile" / pass
    - sbt -batch "++3.3.8" "aws-spi-pekko-http/compile" "s3/compile" 
"testkit/compile" / pass
    - scalafmt --list on changed files / clean
    - PekkoHttpClientSpec gains a directional test asserting the debug line
      renders with the argument substituted; not executed locally, left to CI
    
    References:
    None - follow-up cleanup of slf4j usage in main sources
---
 .../stream/connectors/awsspi/PekkoHttpClient.scala |  2 +-
 .../connectors/awsspi/PekkoHttpClientSpec.scala    | 24 ++++++++++++++++++++++
 .../testkit/javadsl/LogCapturingJunit4.scala       |  6 ++++--
 .../connectors/testkit/scaladsl/LogCapturing.scala |  4 ++--
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git 
a/aws-spi-pekko-http/src/main/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClient.scala
 
b/aws-spi-pekko-http/src/main/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClient.scala
index cb8d25011..a1dc973d0 100644
--- 
a/aws-spi-pekko-http/src/main/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClient.scala
+++ 
b/aws-spi-pekko-http/src/main/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClient.scala
@@ -167,7 +167,7 @@ object PekkoHttpClient {
   }
 
   private[awsspi] def tryCreateCustomContentType(contentTypeStr: String): 
ContentType = {
-    logger.debug(s"Try to parse content type from $contentTypeStr")
+    logger.debug("Try to parse content type from {}", contentTypeStr)
     val mainAndsubType = contentTypeStr.split('/')
     if (mainAndsubType.length == 2)
       ContentType(MediaType.customBinary(mainAndsubType(0), mainAndsubType(1), 
Compressible))
diff --git 
a/aws-spi-pekko-http/src/test/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClientSpec.scala
 
b/aws-spi-pekko-http/src/test/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClientSpec.scala
index 1811285f4..d07b892c3 100644
--- 
a/aws-spi-pekko-http/src/test/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClientSpec.scala
+++ 
b/aws-spi-pekko-http/src/test/scala/org/apache/pekko/stream/connectors/awsspi/PekkoHttpClientSpec.scala
@@ -19,6 +19,9 @@ package org.apache.pekko.stream.connectors.awsspi
 
 import java.util.Collections
 import java.nio.ByteBuffer
+import ch.qos.logback.classic.{ Level, Logger => LogbackLogger }
+import ch.qos.logback.classic.spi.ILoggingEvent
+import ch.qos.logback.core.read.ListAppender
 import com.typesafe.config.ConfigFactory
 
 import org.apache.pekko
@@ -34,6 +37,7 @@ import 
software.amazon.awssdk.http.async.SdkHttpContentPublisher
 import software.amazon.awssdk.utils.AttributeMap
 
 import scala.concurrent.duration._
+import scala.jdk.CollectionConverters._
 import scala.jdk.DurationConverters._
 
 class PekkoHttpClientSpec extends AnyWordSpec with Matchers with OptionValues {
@@ -46,6 +50,26 @@ class PekkoHttpClientSpec extends AnyWordSpec with Matchers 
with OptionValues {
       contentType.mediaType should be(MediaTypes.`application/xml`)
     }
 
+    "log the content type it parses with the argument substituted into the 
message" in {
+      val contentTypeStr = "application/xml"
+      val logbackLogger = PekkoHttpClient.logger.asInstanceOf[LogbackLogger]
+      val appender = new ListAppender[ILoggingEvent]
+      val previousLevel = logbackLogger.getLevel
+      appender.start()
+      logbackLogger.addAppender(appender)
+      logbackLogger.setLevel(Level.DEBUG)
+      try {
+        PekkoHttpClient.tryCreateCustomContentType(contentTypeStr)
+      } finally {
+        logbackLogger.setLevel(previousLevel)
+        logbackLogger.detachAppender(appender)
+        appender.stop()
+      }
+
+      val messages = appender.list.asScala.map(_.getFormattedMessage).toList
+      messages should contain(s"Try to parse content type from 
$contentTypeStr")
+    }
+
     "remove 'ContentType' return 'ContentLength' separate from sdk headers" in 
{
       val headers = new java.util.HashMap[String, java.util.List[String]]
       headers.put("Content-Type", Collections.singletonList("application/xml"))
diff --git 
a/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/javadsl/LogCapturingJunit4.scala
 
b/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/javadsl/LogCapturingJunit4.scala
index e771e9084..a4ace73d5 100644
--- 
a/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/javadsl/LogCapturingJunit4.scala
+++ 
b/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/javadsl/LogCapturingJunit4.scala
@@ -56,10 +56,12 @@ final class LogCapturingJunit4 extends TestRule {
     new Statement {
       override def evaluate(): Unit = {
         try {
-          myLogger.info(s"Logging started for test 
[${description.getClassName}: ${description.getMethodName}]")
+          myLogger.info("Logging started for test [{}: {}]", 
description.getClassName, description.getMethodName)
           base.evaluate()
           myLogger.info(
-            s"Logging finished for test [${description.getClassName}: 
${description.getMethodName}] that was successful")
+            "Logging finished for test [{}: {}] that was successful",
+            description.getClassName,
+            description.getMethodName)
         } catch {
           case NonFatal(e) =>
             println(
diff --git 
a/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/scaladsl/LogCapturing.scala
 
b/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/scaladsl/LogCapturing.scala
index 5af8db8cd..9cd4a2ab1 100644
--- 
a/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/scaladsl/LogCapturing.scala
+++ 
b/testkit/src/main/scala/org/apache/pekko/stream/connectors/testkit/scaladsl/LogCapturing.scala
@@ -65,11 +65,11 @@ trait LogCapturing extends BeforeAndAfterAll { self: 
TestSuite =>
 
   abstract override def withFixture(test: NoArgTest): Outcome = {
     sourceActorSystem.foreach(MDC.put("sourceActorSystem", _))
-    myLogger.info(s"Logging started for test [${self.getClass.getName}: 
${test.name}]")
+    myLogger.info("Logging started for test [{}: {}]", self.getClass.getName, 
test.name)
     sourceActorSystem.foreach(_ => MDC.remove("sourceActorSystem"))
     val res = test()
     sourceActorSystem.foreach(MDC.put("sourceActorSystem", _))
-    myLogger.info(s"Logging finished for test [${self.getClass.getName}: 
${test.name}] that [$res]")
+    myLogger.info("Logging finished for test [{}: {}] that [{}]", 
self.getClass.getName, test.name, res)
     sourceActorSystem.foreach(_ => MDC.remove("sourceActorSystem"))
 
     if (!(res.isSucceeded || res.isPending)) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to