Swift:
写入标准错误

如何操作:

在Swift中,可以使用FileHandle类直接访问stderr来写入标准错误。以下是一个简单示例:

import Foundation

// 定义一条消息
let errorMessage = "发生了一个错误。\n"

// 将消息转换为数据
if let data = errorMessage.data(using: .utf8) {
    // 将错误消息写入stderr
    FileHandle.standardError.write(data)
}

输出到stderr(通常在控制台或终端中查看):

发生了一个错误。

对于更复杂的日志记录或在使用外部库时,可能会考虑使用第三方库,如SwiftLog。尽管SwiftLog没有直接支持写入stderr,但你可以实现一个自定义的日志后端来实现这一点。以下是定义一个将日志写入stderr的自定义日志处理程序的简化示例:

首先,在Package.swift中将SwiftLog添加到项目依赖项中:

// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "你的包名",
    dependencies: [
        .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "你的目标名称",
            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("这是一条错误消息")

输出到stderr:

这是一条错误消息

这个自定义处理程序允许你将SwiftLog的错误消息直接路由到标准错误,与应用程序可能生成的其他日志消息无缝集成。