Tenho um yesod
servidor web Haskell que funciona bem 1,2 e registra bem 3 :
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE OverloadedStrings #-}
import Yesod
import Prelude
import Data.Aeson()
import GHC.Generics
import Data.Text
import Data.Time
import Yesod.Core.Types
import System.Log.FastLogger
import Network.Wai.Handler.Warp
-- Wai stuff
import qualified Network.Wai
import qualified Network.Wai.Logger
import qualified Network.HTTP.Types.Status
import qualified Network.Wai.Middleware.RequestLogger as Wai
data Healthy = Healthy Bool deriving ( Generic )
-- | This is just for the health check ...
instance ToJSON Healthy where toJSON (Healthy status) = object [ "healthy" .= status ]
data App = App
mkYesod "App" [parseRoutes|
/healthcheck HealthcheckR GET
|]
instance Yesod App where
makeLogger = \_app -> myLogger
getHealthcheckR :: Handler Value
getHealthcheckR = do
$logInfoS "(HealthCheck)" "Good !"
returnJson $ Healthy True
myLogger :: IO Logger
myLogger = do
_loggerSet <- newStdoutLoggerSet defaultBufSize
formatter <- newTimeCache "[%d/%m/%Y ( %H:%M:%S )]"
return $ Logger _loggerSet formatter
dateFormatter :: String -> String
dateFormatter date = let
date' = parseTimeOrError True defaultTimeLocale "%d/%b/%Y:%T %Z" date :: UTCTime
in formatTime defaultTimeLocale "[%Y/%m/%d ( %H:%M:%S )]" date'
formatter :: Network.Wai.Logger.ZonedDate -> Network.Wai.Request -> Network.HTTP.Types.Status.Status -> Maybe Integer -> LogStr
formatter zonedDate req status responseSize = "[ 17/17/2017 ]\n"
main :: IO ()
main = do
waiApp <- toWaiApp App
middleware <- Wai.mkRequestLogger (Wai.defaultRequestLoggerSettings { Wai.outputFormat = Wai.CustomOutputFormat formatter })
run 3000 $ middleware waiApp
Quando inspeciono os logs, vejo três mensagens, duas delas são minhas
[23/10/2024 ( 15:07:06 )] [Info#(HealthCheck)] Good ! @(main:Main src/Main.hs:41:6)
172.17.0.1 - - [23/Oct/2024:15:07:06 +0000] "GET /healthcheck HTTP/1.1" 200 16 "" "curl/8.9.1"
[ 17/17/2017 ]
De onde vem a 172.17.0.1 - - ...
mensagem?! Parece que deve vir da camada Wai (certo?) Mas, novamente, pensei que tinha configurado os logs Wai
1,2 código fonte completo aqui , editado para minimalismo de acordo com os comentários
3 bem, quase!
A
toWaiApp
função adiciona middleware padrão que inclui registro de requisição. Para adicionar o middleware padrão excluindo registro, você precisa usartoWaiAppPlain
e então adicionar um conjunto padrão de middleware sem registro:Após essa alteração, o programa de teste na questão gera apenas duas linhas para uma solicitação: