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.