Swift:
Schreiben auf Standardfehler
Wie geht das:
In Swift kann man durch die Verwendung der Klasse FileHandle
direkt auf stderr zugreifen, um dorthin zu schreiben. Hier ist ein einfaches Beispiel:
import Foundation
// Definiere eine Nachricht
let errorMessage = "Ein Fehler ist aufgetreten.\n"
// Konvertiere die Nachricht in Daten
if let data = errorMessage.data(using: .utf8) {
// Schreibe die Fehlermeldung in stderr
FileHandle.standardError.write(data)
}
Ausgabe auf stderr (typischerweise in einer Konsole oder einem Terminal zu sehen):
Ein Fehler ist aufgetreten.
Für komplexeres Logging oder bei der Arbeit mit externen Bibliotheken könnte man erwägen, eine Drittanbieterbibliothek wie SwiftLog zu verwenden. Obwohl SwiftLog nicht direkt out of the box auf stderr schreibt, können Sie eine benutzerdefinierte Log-Backend implementieren, um dies zu erreichen. Hier ist ein vereinfachtes Beispiel für die Definition eines benutzerdefinierten Log-Handlers, der auf stderr schreibt:
Fügen Sie zunächst SwiftLog zu Ihren Projekt-Abhängigkeiten in Package.swift
hinzu:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "IhrPaketName",
dependencies: [
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
],
targets: [
.target(
name: "IhrZielName",
dependencies: [
.product(name: "Logging", package: "swift-log"),
]),
]
)
Implementieren Sie dann einen benutzerdefinierten Log-Handler, der auf stderr schreibt:
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) { }
}
}
// Verwendung
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.example.yourapp")
logger.error("Dies ist eine Fehlermeldung")
Ausgabe auf stderr:
Dies ist eine Fehlermeldung
Dieser benutzerdefinierte Handler ermöglicht es Ihnen, Ihre SwiftLog-Fehlermeldungen direkt auf den Standardfehler zu leiten und nahtlos in andere Log-Nachrichten zu integrieren, die Ihre Anwendung generieren könnte.