Skip to content

Logging

Vapor's logging API is built on top of SwiftLog. This means Vapor is compatible with all of SwiftLog's backend implementations.

Logger

Instances of Logger are used for outputting log messages. Vapor provides a few easy ways to get access to a logger.

Request

Each incoming Request has a unique logger that you should use for any logs specific to that request.

app.get("hello") { req -> String in
    req.logger.info("Hello, logs!")
    return "Hello, world!"
}

The request logger includes a unique UUID identifying the incoming request to make tracking logs easier.

[ INFO ] Hello, logs! [request-id: C637065A-8CB0-4502-91DC-9B8615C5D315] (App/routes.swift:10)

Info

Logger metadata will only be shown in debug log level or lower.

Application

For log messages during app boot and configuration, use Application's logger.

app.logger.info("Setting up migrations...")
app.migrations.use(...)

Custom Logger

In situations where you don't have access to Application or Request, you can initialize a new Logger.

let logger = Logger(label: "dev.logger.my")
logger.info(...)

While custom loggers will still output to your configured logging backend, they will not have important metadata attached like request UUID. Use the request or application specific loggers wherever possible.

Level

SwiftLog supports several different logging levels.

name description
trace Appropriate for messages that contain information normally of use only when tracing the execution of a program.
debug Appropriate for messages that contain information normally of use only when debugging a program.
info Appropriate for informational messages.
notice Appropriate for conditions that are not error conditions, but that may require special handling.
warning Appropriate for messages that are not error conditions, but more severe than notice.
error Appropriate for error conditions.
critical Appropriate for critical error conditions that usually require immediate attention.

When a critical message is logged, the logging backend is free to perform more heavy-weight operations to capture system state (such as capturing stack traces) to facilitate debugging.

By default, Vapor will use info level logging. When run with the production environment, notice will be used to improve performance.

Changing Log Level

Regardless of environment mode, you can override the logging level to increase or decrease the amount of logs produced.

The first method is to pass the optional --log flag when booting your application.

vapor run serve --log debug

The second method is to set the LOG_LEVEL environment variable.

export LOG_LEVEL=debug
vapor run serve

Both of these can be done in Xcode by editing the Run scheme.

Configuration

SwiftLog is configured by boostrapping the LoggingSystem once per process. Vapor projects typically do this in main.swift.

import Vapor

var env = try Environment.detect()
try LoggingSystem.bootstrap(from: &env)

bootstrap(from:) is a helper method provided by Vapor that will configure the default log handler based on command-line arguments and environment variables. The default log handler supports outputting messages to the terminal with ANSI color support.

Custom Handler

You can override Vapor's default log handler and register your own.

import Logging

LoggingSystem.bootstrap { label in
    StreamLogHandler.standardOutput(label: label)
}

All of SwiftLog's supported backends will work with Vapor. However, changing the log level with command-line arguments and environment variables is only compatible with Vapor's default log handler.