Swift:
Scrivere sull'errore standard
Come fare:
In Swift, scrivere sull’errore standard può essere fatto utilizzando la classe FileHandle
per un accesso diretto a stderr. Ecco un semplice esempio:
import Foundation
// Definire un messaggio
let errorMessage = "Si è verificato un errore.\n"
// Convertire il messaggio in dati
if let data = errorMessage.data(using: .utf8) {
// Scrivere il messaggio di errore su stderr
FileHandle.standardError.write(data)
}
Output su stderr (tipicamente visualizzato in una console o un terminale):
Si è verificato un errore.
Per una registrazione più complessa o quando si lavora con librerie esterne, si potrebbe considerare l’uso di una libreria di terze parti come SwiftLog. Anche se SwiftLog non scrive direttamente su stderr di default, è possibile implementare un backend di registrazione personalizzato per ottenere ciò. Ecco un esempio semplificato di definizione di un gestore di log personalizzato che scrive su stderr:
Prima, aggiungi SwiftLog alle dipendenze del tuo progetto in Package.swift
:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "IlTuoNomePacchetto",
dependencies: [
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
],
targets: [
.target(
name: "IlTuoNomeTarget",
dependencies: [
.product(name: "Logging", package: "swift-log"),
]),
]
)
Poi, implementa un gestore di log personalizzato che scrive su 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) { }
}
}
// Utilizzo
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.esempio.latuaapp")
logger.error("Questo è un messaggio di errore")
Output su stderr:
Questo è un messaggio di errore
Questo gestore personalizzato ti permette di indirizzare i tuoi messaggi di errore SwiftLog direttamente all’errore standard, integrandosi senza soluzione di continuità con altri messaggi di log che la tua applicazione potrebbe generare.