Skip to content

Commit 80a36d1

Browse files
authored
version 0.1.2.3: defaultHandleLog400 (#17)
1 parent a70fb68 commit 80a36d1

File tree

4 files changed

+34
-16
lines changed

4 files changed

+34
-16
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
## [0.1.2.3] - 2020-08-17
10+
### Added
11+
- `defaultHandleLog400` middleware to log response bodies of 4xx and 5xx responses.
12+
913
## [0.1.2.2] - 2020-05-19
1014
### Changed
1115
- Ignore `"Warp: Client closed connection prematurely"` exception.

src/Web/Template/Log.hs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,44 @@
22

33
module Web.Template.Log
44
( bcdlog
5+
, bcdlog400
56
) where
67

78
import Data.Aeson (pairs, (.=))
89
import Data.Aeson.Encoding (encodingToLazyByteString)
10+
import Data.ByteString.Builder (toLazyByteString)
911
import Data.Default (Default (..))
10-
import Data.Text as T (Text, pack, unpack,
11-
unwords)
12+
import Data.Text as T (Text, pack, unpack, unwords)
1213
import 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)
1918
import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
2019
import Network.HTTP.Types.Status (Status (..))
21-
import Network.Wai (Middleware, rawPathInfo,
22-
requestMethod)
20+
import Network.Wai (Middleware, rawPathInfo, requestMethod)
2321
import Network.Wai.Logger (ZonedDate)
2422
import Network.Wai.Middleware.RequestLogger (OutputFormat (..),
25-
OutputFormatter,
26-
mkRequestLogger,
23+
OutputFormatterWithDetails, mkRequestLogger,
2724
outputFormat)
2825
import System.BCD.Log (Level (..))
2926
import System.IO.Unsafe (unsafePerformIO)
3027
import System.Log.FastLogger (toLogStr)
3128

3229
{-# NOINLINE bcdlog #-}
3330
bcdlog :: 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"

src/Web/Template/Server.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module Web.Template.Server
99
, runWebServer
1010
, runWebServerWith
1111
, defaultHandleLog
12+
, defaultHandleLog400
1213
, defaultHeaderCORS
1314
, toApplication
1415
) where
@@ -34,7 +35,7 @@ import Web.Scotty.Trans (Options (..), ScottyT, defaultHandle
3435
middleware, next, param, scottyAppT, scottyOptsT,
3536
status)
3637
import Web.Template.Except (Except, JsonWebError (..), handleEx)
37-
import Web.Template.Log (bcdlog)
38+
import Web.Template.Log (bcdlog, bcdlog400)
3839
import Web.Template.Types
3940

4041
-- | Restart `f` on `error` after `1s`.
@@ -87,6 +88,11 @@ evalCustomWebServer CustomWebServer {..} = (fst <$>) . (\rws -> evalRWST rws rea
8788
defaultHandleLog :: Middleware
8889
defaultHandleLog = bcdlog
8990

91+
-- | Log everything as 'defaultHandleLog' and also log response bodies for
92+
-- 4xx and 5xx responses.
93+
defaultHandleLog400 :: Middleware
94+
defaultHandleLog400 = bcdlog400
95+
9096
defaultHeaderCORS :: Middleware
9197
defaultHeaderCORS = modifyResponse (mapResponseHeaders addHeaderCORS)
9298
where

web-template.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: web-template
2-
version: 0.1.2.2
2+
version: 0.1.2.3
33
synopsis: Web template
44
description:
55
Web template includes:

0 commit comments

Comments
 (0)