Swift:
표준 에러에 쓰기

방법:

Swift에서 표준 오류에 쓰기는 직접적으로 stderr 접근을 위한 FileHandle 클래스를 사용하여 수행될 수 있습니다. 간단한 예제는 다음과 같습니다:

import Foundation

// 메시지 정의
let errorMessage = "An error occurred.\n"

// 메시지를 데이터로 변환
if let data = errorMessage.data(using: .utf8) {
    // stderr에 에러 메시지 쓰기
    FileHandle.standardError.write(data)
}

stderr로의 출력(일반적으로 콘솔이나 터미널에서 볼 수 있음):

An error occurred.

보다 복잡한 로깅이나 외부 라이브러리와 함께 작업할 때는 SwiftLog과 같은 서드파티 라이브러리 사용을 고려할 수 있습니다. SwiftLog은 기본적으로 직접 stderr에 쓰지 않지만, 커스텀 로깅 백엔드를 구현하여 이를 달성할 수 있습니다. stderr에 쓰기 위한 사용자 정의 로그 핸들러를 정의하는 간소화된 예는 다음과 같습니다:

먼저 Package.swift에서 프로젝트 의존성에 SwiftLog을 추가하세요:

// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "YourPackageName",
    dependencies: [
        .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "YourTargetName",
            dependencies: [
                .product(name: "Logging", package: "swift-log"),
            ]),
    ]
)

그런 다음 stderr에 쓰는 사용자 정의 로그 핸들러를 구현하세요:

import Logging
import Foundation

struct StderrLogHandler: LogHandler {
    let label: String
    
    var logLevel: Logger.Level = .info
    
    func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, source: String, file: String, function: String, line: UInt) {
        let output = "\(message)\n"
        if let data = output.data(using: .utf8) {
            FileHandle.standardError.write(data)
        }
    }
    
    subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? {
        get { return nil }
        set(newValue) { }
    }
    
    var metadata: Logger.Metadata {
        get { return [:] }
        set(newMetadata) { }
    }
}

// 사용법
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.example.yourapp")

logger.error("This is an error message")

stderr로의 출력:

This is an error message

이 사용자 정의 핸들러를 사용하면 SwiftLog 오류 메시지를 직접 표준 오류로 라우팅할 수 있어, 애플리케이션이 생성할 수 있는 다른 로그 메시지와 원활하게 통합됩니다.