コンテンツにスキップ

ロギング

Vapor のロギング API は SwiftLog を基に構築されています。これは、Vapor が SwiftLog のバックエンド実装と互換性があることを示しています。

ロガー

Logger のインスタンスはログメッセージを出力するために使用されます。Vapor はロガーにアクセスするためのいくつかの簡単な方法を提供しています。

リクエスト

各入力 Request には、そのリクエストに固有のログを使用するためのユニークなロガーがあります。

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

リクエストロガーには、ログの追跡を容易にするために、入力リクエストを識別するユニークな UUID が含まれています。

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

Info

ロガーメタデータは、デバッグログレベルまたはそれ以下でのみ表示されます。

アプリケーション

アプリの起動や設定中のログメッセージには、Application のロガーを使用します。

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

カスタムロガー

ApplicationRequest にアクセスできない状況では、新しい Logger を初期化できます。

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

カスタムロガーは設定されたロギングバックエンドに出力されますが、リクエスト UUID のような重要なメタデータは付加されません。可能な限りリクエストやアプリケーション固有のロガーを使用してください。

レベル

SwiftLog はいくつかの異なるログレベルをサポートしています。

nama description
trace プログラムの実行を追跡する際に通常のみ役立つ情報を含むメッセージに適しています。
debug プログラムをデバッグする際に通常のみ役立つ情報を含むメッセージに適しています。
info 情報メッセージに適しています。
notice エラー条件ではないが、特別な処理が必要な条件に適しています。
warning エラー条件ではないが、noticeよりも重大なメッセージに適しています。
error エラー条件に適しています。
critical 通常は直ちに注意が必要な重大なエラー条件に適しています。

critical メッセージがログに記録されると、ログバックエンドはシステム状態をキャプチャするために重い操作(スタックトレースのキャプチャなど)を自由に実行できます。

デフォルトでは、Vapor は info レベルのログを使用します。production 環境で実行する場合は、パフォーマンス向上のためにnoticeが使用されます。

ログレベルの変更

環境モードに関係なく、ログの量を増減するためにログレベルをオーバーライドできます。

最初の方法は、アプリケーションを起動する際にオプションの --log フラグを渡すことです。

swift run App serve --log debug

2番目の方法は、LOG_LEVEL 環境変数を設定することです。

export LOG_LEVEL=debug
swift run App serve

これらの操作は、Xcodeで App スキームを編集することで行うことができます。

設定

SwiftLog は、プロセスごとに一度 LoggingSystem をブートストラップすることによって設定されます。Vapor プロジェクトでは、これは通常 entrypoint.swift で行われます。

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

bootstrap(from:) は、コマンドライン引数や環境変数に基づいてデフォルトのログハンドラーを設定するために Vapor が提供するヘルパーメソッドです。デフォルトのログハンドラーは、ANSI カラーサポートを備えた端末へのメッセージ出力をサポートしています。

カスタムハンドラー

Vaporのデフォルトのログハンドラーをオーバーライドし、独自のものを登録することができます。

import Logging

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

SwiftLog がサポートするすべてのバックエンドは Vapor と互換性があります。ただし、コマンドライン引数や環境変数を使用したログレベルの変更は、Vapor のデフォルトのログハンドラーとのみ互換性があります。