From 5619a5279b7ef8f567835a0e98f10ac17651785f Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 13 Feb 2025 02:16:12 -0500 Subject: [PATCH] refactor: move the logic to check if the response should be logged into a separate function --- src/PostgREST/Logger.hs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/PostgREST/Logger.hs b/src/PostgREST/Logger.hs index c224f74c7..48a4d8882 100644 --- a/src/PostgREST/Logger.hs +++ b/src/PostgREST/Logger.hs @@ -21,7 +21,7 @@ import Data.Time (ZonedTime, defaultTimeLocale, formatTime, import qualified Network.Wai as Wai import qualified Network.Wai.Middleware.RequestLogger as Wai -import Network.HTTP.Types.Status (status400, status500) +import Network.HTTP.Types.Status (Status, status400, status500) import System.IO.Unsafe (unsafePerformIO) import PostgREST.Config (LogLevel (..)) @@ -57,24 +57,26 @@ logWithDebounce loggerState action = do -- TODO stop using this middleware to reuse the same "observer" pattern for all our logs middleware :: LogLevel -> (Wai.Request -> Maybe BS.ByteString) -> Wai.Middleware -middleware logLevel getAuthRole = case logLevel of - LogCrit -> requestLogger (const False) - LogError -> requestLogger (>= status500) - LogWarn -> requestLogger (>= status400) - LogInfo -> requestLogger (const True) - LogDebug -> requestLogger (const True) - where - requestLogger filterStatus = unsafePerformIO $ +middleware logLevel getAuthRole = + unsafePerformIO $ Wai.mkRequestLogger Wai.defaultRequestLoggerSettings { Wai.outputFormat = Wai.ApacheWithSettings $ Wai.defaultApacheSettings & - Wai.setApacheRequestFilter (\_ res -> filterStatus $ Wai.responseStatus res) & + Wai.setApacheRequestFilter (\_ res -> shouldLogResponse logLevel $ Wai.responseStatus res) & Wai.setApacheUserGetter getAuthRole , Wai.autoFlush = True , Wai.destination = Wai.Handle stdout } +shouldLogResponse :: LogLevel -> Status -> Bool +shouldLogResponse logLevel = case logLevel of + LogCrit -> const False + LogError -> (>= status500) + LogWarn -> (>= status400) + LogInfo -> const True + LogDebug -> const True + -- All observations are logged except some that depend on the log-level observationLogger :: LoggerState -> LogLevel -> ObservationHandler observationLogger loggerState logLevel obs = case obs of