Skip to content

Commit c63a48d

Browse files
ozzzzzvks4git
authored andcommitted
version 0.1.1.1: logging changed (#3)
1 parent 0cd2cf2 commit c63a48d

File tree

4 files changed

+77
-29
lines changed

4 files changed

+77
-29
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Changelog
2+
All notable changes to this project will be documented in this file.
3+
4+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6+
7+
## [Unreleased]
8+
9+
## [0.1.1.1] - 2018-09-12
10+
### Changed
11+
- Logging format. Now it is look like: `{"app":"scotty","msg":"GET /v1/ping 200","timestamp":0,"level":"INFO","datetime":"1970-01-01T00:00:00+0000"}`. TODO: use correct time.

src/Web/Template/Log.hs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
3+
module Web.Template.Log
4+
(
5+
bcdlog
6+
) where
7+
8+
import qualified Data.ByteString.Char8 as BS8 (pack)
9+
import Data.Default (Default (..))
10+
import Data.Monoid ((<>))
11+
import Data.Text.Encoding (decodeUtf8)
12+
import Network.HTTP.Types.Status (Status (..))
13+
import Network.Wai (Middleware, rawPathInfo,
14+
requestMethod)
15+
import Network.Wai.Middleware.RequestLogger (OutputFormat (..),
16+
OutputFormatter,mkRequestLogger,
17+
outputFormat)
18+
import System.BCD.Log (Level (..), Log (..),
19+
format)
20+
import System.Log.FastLogger (toLogStr)
21+
22+
bcdlog :: IO Middleware
23+
bcdlog = mkRequestLogger $ def {outputFormat = CustomOutputFormat customFormatter}
24+
25+
customFormatter :: OutputFormatter
26+
customFormatter _ request status _ = do
27+
let msg' = requestMethod request <> " " <>
28+
rawPathInfo request <> " " <>
29+
(BS8.pack . show . statusCode $ status)
30+
-- TODO: time and formatted time are not correct now. It can be parsed
31+
-- from first argument of 'OutputFormatter' and reformatted.
32+
let log' = Log "1970-01-01T00:00:00+0000" 0 INFO "scotty" (decodeUtf8 msg')
33+
toLogStr . format $ log'

src/Web/Template/Server.hs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,31 @@ module Web.Template.Server
1111
, defaultHandleLog
1212
) where
1313

14-
import Control.Monad.RWS (evalRWST)
15-
import Data.String (fromString)
16-
import Data.Text.Encoding (encodeUtf8)
17-
import Data.Text.Lazy as TL (Text, toStrict)
18-
import Network.HTTP.Types.Status (status401, status405)
19-
import Network.Wai (Response)
20-
import Network.Wai.Handler.Warp (defaultSettings,
21-
exceptionResponseForDebug,
22-
setOnExceptionResponse,
23-
setPort)
24-
import Network.Wai.Middleware.RequestLogger (logStdout)
25-
import Web.Cookie (parseCookiesText)
26-
import Web.Scotty.Trans (Options (..),
27-
defaultHandler, header,
28-
json, middleware, param,
29-
scottyOptsT, status)
30-
import Web.Template.Except (JsonWebError (..),
31-
handleEx)
14+
import Control.Monad.RWS (evalRWST)
15+
import Data.String (fromString)
16+
import Data.Text.Encoding (encodeUtf8)
17+
import Data.Text.Lazy as TL (Text, toStrict)
18+
import Network.HTTP.Types.Status (status401, status405)
19+
import Network.Wai (Response)
20+
import Network.Wai.Handler.Warp (defaultSettings,
21+
exceptionResponseForDebug,
22+
setOnExceptionResponse, setPort)
23+
import Web.Cookie (parseCookiesText)
24+
import Web.Scotty.Trans (Options (..), defaultHandler,
25+
header, json, middleware, param,
26+
scottyOptsT, status)
27+
import Web.Template.Except (JsonWebError (..), handleEx)
28+
import Web.Template.Log (bcdlog)
3229
import Web.Template.Types
3330

3431
-- | For given port and server settings run the server.
3532
runWebServer :: (Monoid w, Show w) => Port -> CustomWebServer r w s -> IO ()
36-
runWebServer port CustomWebServer{..} = scottyOptsT (scottyOpts port) (handleLog .
37-
(\rws -> evalRWST rws readerEnv stateEnv)) $ do
38-
middleware logStdout
39-
defaultHandler handleEx
40-
mapM_ runRoute routes
33+
runWebServer port CustomWebServer{..} = do
34+
customLog <- bcdlog
35+
scottyOptsT (scottyOpts port) (handleLog . (\rws -> evalRWST rws readerEnv stateEnv)) $ do
36+
middleware customLog
37+
defaultHandler handleEx
38+
mapM_ runRoute routes
4139

4240
defaultHandleLog :: Show w => IO (Response, w) -> IO Response
4341
defaultHandleLog = (print . snd <$>) >> (fst <$>)
@@ -70,3 +68,4 @@ checkVersion version route = do
7068

7169
getIdFromCookies :: TL.Text -> Maybe UserId
7270
getIdFromCookies cookies = lookup "id" $ parseCookiesText $ encodeUtf8 $ toStrict cookies
71+

web-template.cabal

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: web-template
2-
version: 0.1.1.0
2+
version: 0.1.1.1
33
synopsis: Web template
44
description:
55
Web template includes:
@@ -24,17 +24,22 @@ library
2424
other-modules: Web.Template.Except
2525
, Web.Template.Server
2626
, Web.Template.Types
27+
, Web.Template.Log
2728
build-depends: base >= 4.7 && < 5
28-
, scotty
29+
, aeson
30+
, bytestring
31+
, bcd-log
32+
, cookie
33+
, data-default
34+
, fast-logger
2935
, http-types
3036
, mtl
31-
, text
3237
, optparse-generic
33-
, cookie
34-
, aeson
35-
, warp
38+
, scotty
39+
, text
3640
, wai
3741
, wai-extra
42+
, warp
3843
default-language: Haskell2010
3944

4045
executable web-template

0 commit comments

Comments
 (0)