Swift:
Écrire sur l'erreur standard

Comment faire :

En Swift, l’écriture dans l’erreur standard peut se faire à l’aide de la classe FileHandle pour un accès direct à stderr. Voici un exemple simple :

import Foundation

// Définir un message
let errorMessage = "Une erreur s'est produite.\n"

// Convertir le message en données
if let data = errorMessage.data(using: .utf8) {
    // Écrire le message d'erreur dans stderr
    FileHandle.standardError.write(data)
}

Sortie vers stderr (habituellement vue dans une console ou un terminal) :

Une erreur s'est produite.

Pour une journalisation plus complexe ou lors du travail avec des bibliothèques externes, on pourrait envisager d’utiliser une bibliothèque tierce comme SwiftLog. Bien que SwiftLog n’écrive pas directement dans stderr dès le départ, vous pouvez implémenter un backend de journalisation personnalisé pour y parvenir. Voici un exemple simplifié de la définition d’un gestionnaire de journalisation personnalisé qui écrit dans stderr :

D’abord, ajoutez SwiftLog à vos dépendances de projet dans Package.swift :

// swift-tools-version:5.3

import PackageDescription

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

Ensuite, implémentez un gestionnaire de journalisation personnalisé qui écrit dans 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, fichier: String, fonction: String, ligne: 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) { }
    }
}

// Utilisation
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.exemple.votreappli")

logger.error("Ceci est un message d'erreur")

Sortie vers stderr :

Ceci est un message d'erreur

Ce gestionnaire personnalisé vous permet de diriger vos messages d’erreur SwiftLog directement vers l’erreur standard, s’intégrant de manière transparente avec d’autres messages de journalisation que votre application pourrait générer.