diff --git a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ClientMiddleware.scala b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ClientMiddleware.scala index 188d5b9..8b488e3 100644 --- a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ClientMiddleware.scala +++ b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ClientMiddleware.scala @@ -44,9 +44,9 @@ object ClientMiddleware { def removedContextKeys(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]) = Set.empty[String] def additionalContext(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Map[String, String] = Map.empty[String, String] def logLevel(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = - SharedStructuredLogging.logLevel(request, outcome) - def quietLogLevel(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = - SharedStructuredLogging.quietLogLevel(request, outcome) + SharedStructuredLogging.logLevel(LogLevel.Debug.some)(request, outcome) + def logLevelWithDefault(default: Option[LogLevel])(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = + SharedStructuredLogging.logLevel(default)(request, outcome) def logMessage(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]], now: FiniteDuration): String = CommonLog.logMessage(ZoneId.systemDefault(), false, true, true)(request, outcome, now) } @@ -135,6 +135,8 @@ object ClientMiddleware { def withRemovedContextKeys(removedContextKeys: (Request[Pure], Outcome[Option, Throwable, Response[Pure]]) => Set[String]) = copy(removedContextKeys = removedContextKeys) + def withStaticRemovedContextKeys(removedContextKeys: Set[String]) = + withRemovedContextKeys((_,_) => removedContextKeys) def withWillLog(willLog: Request[Pure] => F[Boolean]) = copy(willLog = willLog) @@ -150,19 +152,31 @@ object ClientMiddleware { copy(requestObserveBody = boolean) def withObserveResponseBody(boolean: Boolean) = copy(responseObserveBody = boolean) + def withObserveSharedBody(boolean: Boolean) = + withObserveRequestBody(boolean) + .withObserveResponseBody((boolean)) def withRequestBodyEncoder(encoder: Request[Pure] => Option[String]) = copy(requestBodyEncoder = encoder) def withResponseBodyEncoder(encoder: Response[Pure] => Option[String]) = copy(responseBodyEncoder = encoder) + def withSharedBodyEncoder(encoder: Message[Pure] => Option[String]) = + withRequestBodyEncoder(encoder) + .withResponseBodyEncoder(encoder) def withRequestBodyMaxSize(l: Long) = copy(requestBodyMaxSize = l) def withResponseBodyMaxSize(l: Long) = copy(responseBodyMaxSize = l) + def withSharedBodyMaxSize(l: Long) = + withRequestBodyMaxSize(l) + .withResponseBodyMaxSize(l) def withLogLevel(logLevel: (Request[Pure], Outcome[Option, Throwable, Response[Pure]]) => Option[LogLevel]) = copy(logLevel = logLevel) + def withStaticLogLevel(logLevel: Option[LogLevel]) = + withLogLevel((_,_) => logLevel) + def withLogMessage(logMessage: (Request[Pure], Outcome[Option, Throwable, Response[Pure]], FiniteDuration) => String) = copy(logMessage = logMessage) @@ -170,6 +184,9 @@ object ClientMiddleware { copy(reqHeaders = reqHeaders) def withAllowedResponseHeaders(respHeaders: Set[CIString]) = copy(respHeaders = respHeaders) + def withAllowedSharedHeaders(headers: Set[CIString]) = + withAllowedRequestHeaders(headers) + .withAllowedResponseHeaders(headers) def client(client: Client[F]): Client[F] = if (requestObserveBody || responseObserveBody) clientWithBody[F](logger, willLog, routeClassifier, reqHeaders, requestIncludeUrl, requestObserveBody, requestBodyEncoder, requestBodyMaxSize, respHeaders, responseObserveBody, responseBodyEncoder, responseBodyMaxSize, removedContextKeys, additionalContext, logLevel, logMessage)(client) diff --git a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ServerMiddleware.scala b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ServerMiddleware.scala index fc0c094..6192cec 100644 --- a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ServerMiddleware.scala +++ b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/ServerMiddleware.scala @@ -43,9 +43,9 @@ object ServerMiddleware { def removedContextKeys(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]) = Set.empty[String] def additionalContext(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Map[String, String] = Map.empty[String, String] def logLevel(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = - SharedStructuredLogging.logLevel(request, outcome) - def quietLogLevel(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = - SharedStructuredLogging.quietLogLevel(request, outcome) + SharedStructuredLogging.logLevel(LogLevel.Debug.some)(request, outcome) + def logLevelWithDefault(default: Option[LogLevel])(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = + SharedStructuredLogging.logLevel(default)(request, outcome) def logMessage(request: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]], now: FiniteDuration): String = CommonLog.logMessage(ZoneId.systemDefault(), false, false, false)(request, outcome, now) } @@ -155,16 +155,25 @@ object ServerMiddleware { copy(requestObserveBody = boolean) def withObserveResponseBody(boolean: Boolean) = copy(responseObserveBody = boolean) + def withObserveSharedBody(boolean: Boolean) = + withObserveRequestBody(boolean) + .withObserveResponseBody((boolean)) def withRequestBodyEncoder(encoder: Request[Pure] => Option[String]) = copy(requestBodyEncoder = encoder) def withResponseBodyEncoder(encoder: Response[Pure] => Option[String]) = copy(responseBodyEncoder = encoder) + def withSharedBodyEncoder(encoder: Message[Pure] => Option[String]) = + withRequestBodyEncoder(encoder) + .withResponseBodyEncoder(encoder) def withRequestBodyMaxSize(l: Long) = copy(requestBodyMaxSize = l) def withResponseBodyMaxSize(l: Long) = copy(responseBodyMaxSize = l) + def withSharedBodyMaxSize(l: Long) = + withRequestBodyMaxSize(l) + .withResponseBodyMaxSize(l) def withAdditionalContext(additionalContext: (Request[Pure], Outcome[Option, Throwable, Response[Pure]]) => Map[String, String]) = copy(additionalContext = additionalContext) @@ -181,6 +190,9 @@ object ServerMiddleware { copy(reqHeaders = reqHeaders) def withAllowedResponseHeaders(respHeaders: Set[CIString]) = copy(respHeaders = respHeaders) + def withAllowedSharedHeaders(headers: Set[CIString]) = + withAllowedRequestHeaders(headers) + .withAllowedResponseHeaders(headers) def httpApp(app: HttpApp[F]): HttpApp[F] = if (requestObserveBody || responseObserveBody) httpAppWithBody[F](logger, willLog, routeClassifier, reqHeaders, requestIncludeUrl, requestObserveBody, requestBodyEncoder, requestBodyMaxSize, respHeaders, responseObserveBody, responseBodyEncoder, responseBodyMaxSize, removedContextKeys, additionalContext, logLevel, logMessage)(app) diff --git a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/SharedStructuredLogging.scala b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/SharedStructuredLogging.scala index 7cbcdb7..cf46c49 100644 --- a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/SharedStructuredLogging.scala +++ b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/contextlog/SharedStructuredLogging.scala @@ -15,41 +15,21 @@ private[contextlog] object SharedStructuredLogging { private[contextlog] def pureRequest[F[_]](req: Request[F]): Request[Pure] = Request(req.method, req.uri, req.httpVersion, req.headers, Stream.empty, req.attributes) private[contextlog] def pureResponse[F[_]](resp: Response[F]): Response[Pure] = Response(resp.status, resp.httpVersion, resp.headers, Stream.empty, resp.attributes) - private[contextlog] def logLevel(prelude: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = { + private[contextlog] def logLevel(defaultLevel: Option[LogLevel])(prelude: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = { val _ = prelude outcome match { case Outcome.Succeeded(Some(resp)) => resp.status.responseClass match { - case Status.Informational => LogLevel.Info.some - case Status.Successful => LogLevel.Info.some - case Status.Redirection => LogLevel.Info.some + case Status.Informational => defaultLevel + case Status.Successful => defaultLevel + case Status.Redirection => defaultLevel case Status.ClientError => - if (resp.status.code === 404) LogLevel.Info.some + if (resp.status.code === 404) defaultLevel else LogLevel.Warn.some case Status.ServerError => LogLevel.Error.some } - case Outcome.Succeeded(None) => LogLevel.Info.some - case Outcome.Canceled() => LogLevel.Warn.some - case Outcome.Errored(_) => LogLevel.Error.some - } - } - - private[contextlog] def quietLogLevel(prelude: Request[Pure], outcome: Outcome[Option, Throwable, Response[Pure]]): Option[LogLevel] = { - val _ = prelude - outcome match { - case Outcome.Succeeded(Some(resp)) => - resp.status.responseClass match { - case Status.Informational => None - case Status.Successful => None - case Status.Redirection => None - case Status.ClientError => - if (resp.status.code === 404) None - else LogLevel.Warn.some - case Status.ServerError => LogLevel.Error.some - - } - case Outcome.Succeeded(None) => None + case Outcome.Succeeded(None) => defaultLevel case Outcome.Canceled() => LogLevel.Warn.some case Outcome.Errored(_) => LogLevel.Error.some } diff --git a/core/src/test/scala/io/chrisdavenport/http4s/log4cats/contextlog/MainSpec.scala b/core/src/test/scala/io/chrisdavenport/http4s/log4cats/contextlog/MainSpec.scala index 497d066..8512607 100644 --- a/core/src/test/scala/io/chrisdavenport/http4s/log4cats/contextlog/MainSpec.scala +++ b/core/src/test/scala/io/chrisdavenport/http4s/log4cats/contextlog/MainSpec.scala @@ -9,7 +9,7 @@ import org.typelevel.log4cats.testing.StructuredTestingLogger import org.typelevel.log4cats.extras._ import org.typelevel.log4cats.testing.StructuredTestingLogger.TRACE import org.typelevel.log4cats.testing.StructuredTestingLogger.DEBUG -import org.typelevel.log4cats.testing.StructuredTestingLogger.INFO +import org.typelevel.log4cats.testing.StructuredTestingLogger.DEBUG import org.typelevel.log4cats.testing.StructuredTestingLogger.WARN import org.typelevel.log4cats.testing.StructuredTestingLogger.ERROR import org.http4s.client.Client @@ -44,7 +44,7 @@ class MainSpec extends CatsEffectSuite { assertEquals( logged, Vector( - INFO( + DEBUG( "Http Server - GET", None, Map( @@ -84,7 +84,7 @@ class MainSpec extends CatsEffectSuite { assertEquals( logged, Vector( - INFO( + DEBUG( "Http Server - GET", None, Map( @@ -132,7 +132,7 @@ class MainSpec extends CatsEffectSuite { assertEquals( logged, Vector( - INFO( + DEBUG( "Req Body - Hello from Request!\nResp Body - Hello from Response!", None, Map( @@ -182,7 +182,7 @@ class MainSpec extends CatsEffectSuite { assertEquals( logged, Vector( - INFO( + DEBUG( "HttpClient - GET", None, Map( @@ -235,7 +235,7 @@ class MainSpec extends CatsEffectSuite { assertEquals( logged, Vector( - INFO( + DEBUG( "HttpClient - GET", None, Map(