22
33module Web.Template.Log
44 ( bcdlog
5+ , bcdlog400
56 ) where
67
78import Data.Aeson (pairs , (.=) )
89import Data.Aeson.Encoding (encodingToLazyByteString )
10+ import Data.ByteString.Builder (toLazyByteString )
911import Data.Default (Default (.. ))
10- import Data.Text as T (Text , pack , unpack ,
11- unwords )
12+ import Data.Text as T (Text , pack , unpack , unwords )
1213import Data.Text.Encoding (decodeUtf8 )
13- import Data.Time (ZonedTime ,
14- defaultTimeLocale ,
15- formatTime ,
16- nominalDiffTimeToSeconds ,
17- parseTimeM ,
14+ import qualified Data.Text.Lazy.Encoding as TLE (decodeUtf8 )
15+ import Data.Time (ZonedTime , defaultTimeLocale , formatTime ,
16+ nominalDiffTimeToSeconds , parseTimeM ,
1817 zonedTimeToUTC )
1918import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds )
2019import Network.HTTP.Types.Status (Status (.. ))
21- import Network.Wai (Middleware , rawPathInfo ,
22- requestMethod )
20+ import Network.Wai (Middleware , rawPathInfo , requestMethod )
2321import Network.Wai.Logger (ZonedDate )
2422import Network.Wai.Middleware.RequestLogger (OutputFormat (.. ),
25- OutputFormatter ,
26- mkRequestLogger ,
23+ OutputFormatterWithDetails , mkRequestLogger ,
2724 outputFormat )
2825import System.BCD.Log (Level (.. ))
2926import System.IO.Unsafe (unsafePerformIO )
3027import System.Log.FastLogger (toLogStr )
3128
3229{-# NOINLINE bcdlog #-}
3330bcdlog :: Middleware
34- bcdlog = unsafePerformIO $ mkRequestLogger def {outputFormat = CustomOutputFormat formatter}
31+ bcdlog = unsafePerformIO $ mkRequestLogger def
32+ { outputFormat = CustomOutputFormatWithDetails $ formatter False
33+ }
3534
36- formatter :: OutputFormatter
37- formatter zonedDate request status _ = do
35+ {-# NOINLINE bcdlog400 #-}
36+ bcdlog400 :: Middleware
37+ bcdlog400 = unsafePerformIO $ mkRequestLogger def
38+ { outputFormat = CustomOutputFormatWithDetails $ formatter True
39+ }
40+
41+ formatter :: Bool -> OutputFormatterWithDetails
42+ formatter log400 zonedDate request status _ _ _ respBody = do
3843 let
3944 zonedTime = parseZonedDate zonedDate
4045 statusC = statusCode status
@@ -52,6 +57,9 @@ formatter zonedDate request status _ = do
5257 <> " msg" .= msg'
5358 <> " status" .= statusC
5459 <> " url" .= url
60+ <> if log400 && statusC >= 400
61+ then " response" .= (TLE. decodeUtf8 $ toLazyByteString respBody)
62+ else mempty
5563 )
5664
5765 toLogStr (encodingToLazyByteString res) <> " \n "
0 commit comments