Skip to content

Logging

LoggingMiddleware provides Morgan-style request logging with predefined and custom formats.

// Default format (Dev)
server.use(LoggingMiddleware())
server.use(LoggingMiddleware(LoggingMiddleware.Options(
format = LoggingMiddleware.Format.Combined,
immediate = false,
skip = request => request.path.startsWith("/health"),
handler = msg => println(msg),
debug = false,
)))
OptionTypeDefaultDescription
formatStringFormat.DevLog format string
immediateBooleanfalseLog on request (true) or response (false)
skipRequest => Boolean_ => falseSkip logging for matching requests
handlerString => UnitprintlnCustom log output handler
debugBooleanfalseEnable debug output
:remote-addr - :remote-user [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"
:remote-addr - :remote-user [:date] ":method :url HTTP/:http-version" :status :res[content-length]

Concise colored output for development:

:method :url :status :response-time ms - :res[content-length]
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms

Minimal output:

:method :url :status :res[content-length] - :response-time ms

Use these tokens in custom format strings:

TokenDescription
:methodHTTP method
:urlRequest URL
:statusResponse status code
:response-timeResponse time in milliseconds
:dateTimestamp
:remote-addrClient IP address
:remote-userRemote user
:http-versionHTTP version
:referrerReferrer header
:user-agentUser-Agent header
:res[header]Response header value
server.use(LoggingMiddleware(LoggingMiddleware.Options(
format = ":method :url -> :status (:response-time ms)"
)))
  • Deferred (default): Logs after the response is sent, includes status code and response time
  • Immediate: Logs when the request arrives, no response data available
// Log immediately on request
server.use(LoggingMiddleware(LoggingMiddleware.Options(
immediate = true
)))