Asynchrone Programmierung in TypeScript: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Logging in Swift-Anwendungen: Best Practices für Einsteiger

\n\n

Beim Logging geht es nicht nur darum, Nachrichten auf der Konsole auszugeben. Für einen angehenden iOS/macOS-Entwickler kann ein ordentliches Logging-System eine Lebensretter sein, wenn es um Debugging, Überwachung und Analyse der Anwendungsleistung geht. In diesem Artikel behandeln wir Best Practices für das Logging in Swift – von einfachen Ansätzen bis hin zu professionellen Werkzeugen.

\n\n

Warum ist ordentliches Logging wichtig?

\n

Wenn Ihre Anwendung auf dem Gerät eines Benutzers oder auf einem Server läuft, können Sie nicht einfach „sehen, was schiefgelaufen ist." Logs sind die einzige Informationsquelle über das Programmverhalten in einer Produktionsumgebung. Ordentliches Logging hilft Ihnen:

\n
    \n
  • Fehler schnell zu finden und zu beheben
  • \n
  • Die Abfolge von Ereignissen nachzuverfolgen
  • \n
  • Die Leistung zu analysieren
  • \n
  • Benutzeraktionen zu verstehen (unter Wahrung der Privatsphäre)
  • \n
\n\n

Logging-Level: Debuggen ohne Chaos

\n

Einer der Hauptfehler von Anfängern ist die Verwendung von print() für alles. Führen Sie stattdessen ein System von Logging-Leveln ein. Standard-Level (in aufsteigender Reihenfolge der Wichtigkeit):

\n
    \n
  • Debug — detaillierte Informationen für den Entwickler (Variablenwerte, Funktionsaufrufe)
  • \n
  • Info — wichtige Ereignisse (Bildschirm laden, erfolgreiche Anfrage)
  • \n
  • Warning — potenzielle Probleme (veraltete API, unerwarteter Wert)
  • \n
  • Error — kritische Fehler, die Aufmerksamkeit erfordern
  • \n
\n\n

Beispiel einer einfachen Implementierung in Swift:

\n
enum LogLevel: String {\n    case debug = "🔍 DEBUG"\n    case info = "ℹ️ INFO"\n    case warning = "⚠️ WARNING"\n    case error = "❌ ERROR"\n}\n\nfunc log(_ message: String, level: LogLevel = .debug, file: String = #file, function: String = #function, line: Int = #line) {\n    #if DEBUG\n    let fileName = (file as NSString).lastPathComponent\n    print("[\\(level.rawValue)] [\\(fileName):\\(line)] \\(function) -> \\(message)")\n    #endif\n}\n
\n\n

Verwendung von OSLog (Unified Logging System)

\n

Ab iOS 10 und macOS Sierra empfiehlt Apple die Verwendung von OSLog anstelle von NSLog und print(). Dies ist ein integriertes Logging-System, das:

\n
    \n
  • Nachrichten automatisch kategorisiert
  • \n
  • Dynamisches Aktivieren/Deaktivieren von Leveln unterstützt
  • \n
  • In der Produktion ohne Leistungseinbußen funktioniert
  • \n
  • Sich in Instruments und Console.app integriert
  • \n
\n\n

Grundlegende OSLog-Einrichtung:

\n
import OSLog\n\nextension Logger {\n    static let network = Logger(subsystem: "com.yourapp.network", category: "network")\n    static let ui = Logger(subsystem: "com.yourapp.ui", category: "ui")\n    static let database = Logger(subsystem: "com.yourapp.database", category: "database")\n}\n\n// Verwendung:\nLogger.network.info("API-Anfrage erfolgreich abgeschlossen")\nLogger.ui.error("Fehler beim Anzeigen des Controllers: \\(error.localizedDescription)")\n
\n\n

Der Vorteil von OSLog ist, dass Nachrichten der Ebene debug und info in Release-Builds automatisch deaktiviert werden, sofern nicht anders konfiguriert. Dies verhindert eine Überflutung der Produktionslogs.

\n\n

Frameworks für erweitertes Logging

\n

Wenn Sie zusätzliche Funktionen benötigen (Datei-Logging, Log-Rotation, Fernerfassung), werfen Sie einen Blick auf beliebte Bibliotheken:

\n\n

CocoaLumberjack

\n

Eines der beliebtesten Frameworks für Swift/Objective-C. Es unterstützt:

\n
    \n
  • Mehrere „Empfänger" (Konsole, Datei, entfernter Server)
  • \n
  • Asynchrones Logging
  • \n
  • Nachrichtenformatierung
  • \n
  • Dynamische Änderungen der Log-Level
  • \n
\n\n
import CocoaLumberjack\n\n// Einrichtung in AppDelegate\nDDLog.add(DDOSLogger.sharedInstance) // Konsole\nlet fileLogger = DDFileLogger()\n

Blogs

Buchempfehlungen