Logging in Swift: Best Practices for iOS and macOS

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Logging in Swift Applications: Best Practices



Logging is one of the most important developer tools, especially in the world of mobile and desktop applications in Swift. A properly configured logging system allows not only to quickly find and fix bugs but also to analyze user behavior, performance, and stability of the application on iOS and macOS. In this article, we will cover the best practices for logging in Swift, from basic approaches to advanced solutions using built-in and third-party libraries.



Why is logging needed in Swift?

Quality logging solves several key tasks:

  • Debugging: quick search for causes of crashes and incorrect behavior.
  • Monitoring: tracking the application state in real time.
  • Analytics: collecting data about user actions without violating privacy.
  • Support: assistance in reproducing errors using logs from user devices.


Basic logging levels

In Swift, it is common to use standard logging levels that help filter messages by importance:

  • debug — for debugging during development (usually disabled in release).
  • info — useful information about the application's operation (screen loading, network requests).
  • notice — important events that are not errors.
  • error — errors that do not lead to a crash but require attention.
  • fault — critical errors leading to application failure.


Using the built-in OSLog

Starting with iOS 10 and macOS Sierra, Apple recommends using OSLog (os_log) as the primary logging mechanism. It is efficient, secure, and integrated with Xcode tools (Console.app).

Basic usage example:

import os.log

let logger = Logger(subsystem: "com.example.myapp", category: "network")

func fetchData() { logger.info("Starting data download") // ... request logic logger.debug("Response received: \\(response)")}

Advantages of OSLog:

  • Low performance impact.
  • Automatic filtering by subsystem and category.
  • Support for dynamic filtering in Console.app.
  • Security — logs do not contain personal data by default.


Third-party libraries: SwiftyBeaver and CocoaLumberjack

Although OSLog covers most basic scenarios, third-party solutions are often chosen for complex projects. Let's look at two popular libraries.



SwiftyBeaver

SwiftyBeaver is a lightweight and flexible library with support for colored console output, file logging, and integration with cloud services (e.g., Logtail).

import SwiftyBeaver

let log = SwiftyBeaver.self

// Add a console destinationlet console = ConsoleDestination()log.addDestination(console)

// Loglog.info("Application launched")log.error("Network error: \\(error.localizedDescription)")


CocoaLumberjack

CocoaLumberjack is a more mature and powerful library that supports asynchronous logging, file rotation, and custom formatters. It is ideal for large projects with high performance requirements.

import CocoaLumberjack

DDLog.add(DDOSLogger.sharedInstance) // Console outputlet fileLogger = DDFileLogger()fileLogger.rollingFrequency = 60 * 60 * 24 // Rotation every dayDDLog.add(fileLogger)

DDLogInfo("User authorized")DDLogError("Critical error: \\(error)")


Best practices for logging in Swift



1. Do not log sensitive data

Avoid recording passwords, tokens, credit card numbers, and oth

Blogs

Book Recommendations