From d7dc6a493f3a2dd77eaeb40715622a9d06b61052 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 3 Jan 2021 22:28:47 +0100 Subject: [PATCH] refactor: simplify logger middleware --- postgrest.cabal | 2 -- src/PostgREST/Middleware.hs | 58 +++++++++---------------------------- 2 files changed, 14 insertions(+), 46 deletions(-) diff --git a/postgrest.cabal b/postgrest.cabal index 4711fd48dc5..ccec2fd8211 100644 --- a/postgrest.cabal +++ b/postgrest.cabal @@ -81,7 +81,6 @@ library , contravariant-extras >= 0.3.3 && < 0.4 , cookie >= 0.4.2 && < 0.5 , either >= 4.4.1 && < 5.1 - , fast-logger >= 2.4.5 , gitrev >= 1.2 && < 1.4 , hasql >= 1.4 && < 1.5 , hasql-dynamic-statements == 0.3.1 @@ -111,7 +110,6 @@ library , wai >= 3.2.1 && < 3.3 , wai-cors >= 0.2.5 && < 0.3 , wai-extra >= 3.0.19 && < 3.2 - , wai-logger >= 2.3.2 , wai-middleware-static >= 0.8.1 && < 0.10 , warp >= 3.2.12 && < 3.4 -- -fno-spec-constr may help keep compile time memory use in check, diff --git a/src/PostgREST/Middleware.hs b/src/PostgREST/Middleware.hs index 8a794b03ac7..2b24126e256 100644 --- a/src/PostgREST/Middleware.hs +++ b/src/PostgREST/Middleware.hs @@ -5,7 +5,6 @@ Description : Sets CORS policy. Also the PostgreSQL GUCs, role, search_path and {-# LANGUAGE RecordWildCards #-} module PostgREST.Middleware ( runPgLocals - , pgrstFormat , pgrstMiddleware , optionalRollback ) where @@ -23,21 +22,15 @@ import qualified Hasql.DynamicStatements.Statement as H import qualified Hasql.Transaction as H import qualified Network.HTTP.Types.Header as HTTP import qualified Network.Wai as Wai -import qualified Network.Wai.Logger as Wai import qualified Network.Wai.Middleware.Cors as Wai -import qualified Network.Wai.Middleware.Gzip as Wai import qualified Network.Wai.Middleware.RequestLogger as Wai import Control.Arrow ((***)) -import Data.Function (id) import Data.List (lookup) import Data.Scientific (FPFormat (..), formatScientific, isInteger) -import Network.HTTP.Types.Status (Status, status400, status500, - statusCode) -import System.IO.Unsafe (unsafePerformIO) -import System.Log.FastLogger (toLogStr) +import Network.HTTP.Types.Status (status400, status500) import PostgREST.Config (AppConfig (..), LogLevel (..)) import PostgREST.Config.PgVersion (PgVersion (..), pgVersion140) @@ -95,45 +88,22 @@ runPgLocals conf claims app req jsonDbS actualPgVersion = do unquoted (JSON.Bool b) = show b unquoted v = toS $ JSON.encode v --- | Log in apache format. Only requests that have a status greater than minStatus are logged. --- | There's no way to filter logs in the apache format on wai-extra: https://hackage.haskell.org/package/wai-extra-3.0.29.2/docs/Network-Wai-Middleware-RequestLogger.html#t:OutputFormat. --- | So here we copy wai-logger apacheLogStr function: https://github.com/kazu-yamamoto/logger/blob/a4f51b909a099c51af7a3f75cf16e19a06f9e257/wai-logger/Network/Wai/Logger/Apache.hs#L45 --- | TODO: Add the ability to filter apache logs on wai-extra and remove this function. -pgrstFormat :: Status -> Wai.OutputFormatter -pgrstFormat minStatus date req status responseSize = - if status < minStatus - then mempty - else toLogStr (getSourceFromSocket req) - <> " - - [" - <> toLogStr date - <> "] \"" - <> toLogStr (Wai.requestMethod req) - <> " " - <> toLogStr (Wai.rawPathInfo req <> Wai.rawQueryString req) - <> " " - <> toLogStr (show (Wai.httpVersion req)::Text) - <> "\" " - <> toLogStr (show (statusCode status)::Text) - <> " " - <> toLogStr (maybe "-" show responseSize::Text) - <> " \"" - <> toLogStr (fromMaybe mempty $ Wai.requestHeaderReferer req) - <> "\" \"" - <> toLogStr (fromMaybe mempty $ Wai.requestHeaderUserAgent req) - <> "\"\n" - where - getSourceFromSocket = BS.pack . Wai.showSockAddr . Wai.remoteHost - -pgrstMiddleware :: LogLevel -> Wai.Application -> Wai.Application +pgrstMiddleware :: LogLevel -> Wai.Middleware pgrstMiddleware logLevel = logger logLevel . Wai.cors corsPolicy - where - logger = case logLevel of - LogCrit -> id - LogError -> unsafePerformIO $ Wai.mkRequestLogger Wai.def { Wai.outputFormat = Wai.CustomOutputFormat $ pgrstFormat status500} - LogWarn -> unsafePerformIO $ Wai.mkRequestLogger Wai.def { Wai.outputFormat = Wai.CustomOutputFormat $ pgrstFormat status400} - LogInfo -> Wai.logStdout + +logger :: LogLevel -> Wai.Middleware +logger logLevel app req sendResponse = app req $ \res -> + let + status = Wai.responseStatus res + logRequest = Wai.logStdout app req sendResponse + in + case logLevel of + LogInfo -> logRequest + LogWarn | status >= status400 -> logRequest + LogError | status >= status500 -> logRequest + _ -> sendResponse res -- | CORS policy to be used in by Wai Cors middleware corsPolicy :: Wai.Request -> Maybe Wai.CorsResourcePolicy