Escrevendo para o erro padrão

Swift:
Escrevendo para o erro padrão

Como Fazer:

Em Swift, escrever no erro padrão pode ser feito usando a classe FileHandle para acesso direto ao stderr. Aqui está um exemplo simples:

import Foundation

// Define uma mensagem
let errorMessage = "Ocorreu um erro.\n"

// Converte a mensagem para dados
if let data = errorMessage.data(using: .utf8) {
    // Escreve a mensagem de erro no stderr
    FileHandle.standardError.write(data)
}

Saída para stderr (tipicamente vista em um console ou terminal):

Ocorreu um erro.

Para registro de logs mais complexos ou quando trabalhando com bibliotecas externas, pode-se considerar o uso de uma biblioteca de terceiros como SwiftLog. Embora SwiftLog não escreva no stderr diretamente de cara, você pode implementar um backend de registro personalizado para alcançar isso. Aqui está um exemplo simplificado de definição de um manipulador de log personalizado que escreve no stderr:

Primeiro, adicione SwiftLog às dependências do seu projeto em Package.swift:

// swift-tools-version:5.3

import PackageDescription

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

Então, implemente um manipulador de log personalizado que escreve no 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) { }
    }
}

// Uso
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.exemplo.seuapp")

logger.error("Esta é uma mensagem de erro")

Saída para stderr:

Esta é uma mensagem de erro

Este manipulador personalizado permite que você direcione suas mensagens de erro SwiftLog diretamente para o erro padrão, integrando-se perfeitamente com outras mensagens de log que sua aplicação possa gerar.