콘텐츠로 이동

로깅(Logging)

Vapor의 로깅 API은 SwiftLog을 기반으로 구성되었습니다. 따라서, Vapor는 모든 SwiftLog의 backend implementations와 호환됩니다.

로거(Logger)

Logger의 인스턴스는 로그 메시지를 출력하는 데 사용됩니다. Vapor는 logger에 접근할 수 있는 몇 가지 방법을 제공합니다.

요청(Request)

각각 들어오는 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

앱이 부팅되고 설정되는 동안에는 Application의 로거를 사용해서 로그 메시지를 출력할 수 있습니다.

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

커스텀 로거(Custom Logger)

Application이나 Request에 접근할 수 없는 상황에서는 새로운 Logger를 생성할 수 있습니다.

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

커스텀 로거도 설정된 데로 로그를 출력하지만, 요청 UUID 같은 중요한 메타데이터는 포함되지 않습니다. 가능한 request나 application의 고유 로거를 사용하세요.

레벨(Level)

SwiftLog는 여러 단계의 로깅 레벨을 지원합니다.

name description
trace 프로그램의 실행을 추적하기 위한 정보를 포함하는 메시지에 적합합니다.
debug 프로그램을 디버깅하기 위한 정보를 포함하는 메시지에 적합합니다.
info 정보를 제공하는 메시지에 적합합니다.
notice 에러가 발생한 상태는 아니지만, 특별한 작업이 필요할 수 있는 상태에 적합합니다.
warning 에러가 발생한 상태는 아니지만, notice보다 심각한 상태에 적합합니다.
error 에러가 발생한 상태에 적합합니다.
critical 즉각적인 주의 조치가 필요한 치명적인 에러 상황에 적합합니다.

critical 메시지가 기록될 때, 로깅 백엔드 시스템은 디버깅을 위해서 시스템 상태를 기록하는 무거운 작업(Stack Traces를 기록하는 것 같은)을 자유롭게 수행할 수 있습니다.

Vapor는 기본적으로 info 레벨의 로깅을 사용합니다. production 환경에서는 향상된 성능을 위해 notice 레벨이 사용됩니다.

로그 레벨 변경

환경 모드에 상관없이, 생성되는 로그의 양을 늘리거나 줄이기 위해서 로깅 레벨을 재설정할 수 있습니다.

첫 번째 방법은 어플리케이션을 부팅할 때, --log 옵셔널 플래그를 전달하는 것입니다.

swift run App serve --log debug

두 번째 방법은 환경 변수로 LOG_LEVEL을 설정하는 것입니다.

export LOG_LEVEL=debug
swift run App serve

두 가지 방법 모두 Xcode에서 App scheme을 수정해서 설정할 수 있습니다.

설정(Configuration)

SwiftLog는 프로세스당 한번 LoggingSystem을 초기화(bootstrapping) 해서 설정됩니다. Vapor 프로젝트는 일반적으로 entrypoint.swift에서 이 작업을 수행합니다.

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

bootstrap(from:) 메서드를 사용하면 명령행(command-line) 인자와 환경 변수를 기반으로 기본 로그 핸들러를 설정할 수 있습니다. 기본 로그 핸들러는 터미널에서 ANSI 색상이 적용된 로그를 제공합니다.

커스텀 핸들러(Custom Handler)

Vapor의 기본 로그 핸들러를 사용자의 핸들러로 재설정 할 수 있습니다.

import Logging

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

SwiftLog가 지원하는 모든 로그 백엔드는 Vapor에서 사용할 수 있습니다. 그러나, 로그 레벨을 명령행 인자와 환경 변수로 설정하는 것은 오직 Vapor의 기본 로그 핸들러에서만 적용됩니다.