Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
A simple logging middleware for WAI applications that supports the 'log-*' family of packages: https://hackage.haskell.org/package/log-base
When logging to stdout
using defaultOptions
, the output looks like this:
2020-10-27 12:30:23 INFO eid-server: Request received { "url": "/api/v1/transaction/new", "body_length": "KnownLength 136", "method": "POST", "user_agent": "curl/7.68.0", "request_id": "f2c89425-9ec4-4cd2-ae56-4bab23681fce", "remote_host": "127.0.0.1:34694" } 2020-10-27 12:30:23 INFO eid-server: Sending response { "request_id": "f2c89425-9ec4-4cd2-ae56-4bab23681fce" } 2020-10-27 12:30:23 INFO eid-server: Request complete { "response_body": null, "url": "/api/v1/transaction/new", "method": "POST", "status": { "code": 400, "message": "Bad Request" }, "time": { "process": 2.97493e-3, "full": 3.159565e-3 }, "request_id": "f2c89425-9ec4-4cd2-ae56-4bab23681fce" }
Synopsis
- mkLogMiddleware :: MonadLog m => m (LogMiddleware UUID)
- mkLogMiddlewareWith :: (MonadLog m, ToJSON id) => Options id -> m (LogMiddleware id)
- type LogMiddleware id = (id -> Application) -> Application
- data Options id = Options {
- logLevel :: LogLevel
- logRequest :: id -> Request -> [Pair]
- logResponse :: id -> Request -> Response -> Value -> ResponseTime -> [Pair]
- logBody :: Maybe (Request -> Status -> ResponseHeaders -> Maybe (Builder -> Value))
- logGetRequestId :: Request -> IO id
- data ResponseTime = ResponseTime {}
- defaultOptions :: Options UUID
- defaultLogRequest :: ToJSON id => id -> Request -> [Pair]
- defaultLogResponse :: ToJSON id => id -> Request -> Response -> Value -> ResponseTime -> [Pair]
- mkOpaqueDefaultOptions :: ToJSON id => (Request -> IO id) -> Options id
- logRequestId :: (MonadLog m, ToJSON id) => id -> m a -> m a
Create a Middleware
mkLogMiddleware :: MonadLog m => m (LogMiddleware UUID) Source #
Create a LogMiddleware
using defaultOptions
Use mkLogMiddlewareWith
for custom Options
mkLogMiddlewareWith :: (MonadLog m, ToJSON id) => Options id -> m (LogMiddleware id) Source #
Create a LogMiddleware
using the supplied Options
Type
type LogMiddleware id = (id -> Application) -> Application Source #
The classic wai
Middleware
type is Application -> Application
, but
that does not work when you want to pass logging context down to the
Application
.
Instead we pass an id to the Application
, containing the
request_id
, so it can be logged in the application's context.
Options
Logging options
Logging response body involves extracting it from Response
via IO operations,
therefore the logBody
option takes Request
, Status
and ResponseHeaders
as arguments to decide whether the IO operations of body extraction have
to be performed.
The resulting Maybe
function is the constructor of a loggable Value
from the body bytestring builder.
Options | |
|
data ResponseTime Source #
Timing data
ResponseTime | |
|
defaultOptions :: Options UUID Source #
Default Options
{ logLevel =LogInfo
, logRequest =defaultLogRequest
, logResponse =defaultLogResponse
, logGetRequestId = 'const nextRandom' }
defaultLogRequest :: ToJSON id => id -> Request -> [Pair] Source #
Logs the following request values:
- request_uuid
- method
- url path
- remote host
- user agent
- body-length
defaultLogResponse :: ToJSON id => id -> Request -> Response -> Value -> ResponseTime -> [Pair] Source #
Logs the following values:
- request_id
- request method
- request url path
- response_body details provided as
Value
- status code
- status message
- time full
- time processing
Time is in seconds as that is how NominalDiffTime
is treated by default
mkOpaqueDefaultOptions :: ToJSON id => (Request -> IO id) -> Options id Source #
Build a default Options
record for an opaque id given a function
for retrieving an id.