Engineering · iOS · Tooling
Top 5 iOS logging & diagnostics libraries
Five real, actively maintained libraries, in the order you'd actually reach for them. What each is for, the install snippet, and where Apple's own OSLog is already enough on its own.
OSLog / Logger, built into iOS 14+, covers structured logging with zero setup and zero cost. Everything below solves a problem OSLog doesn't: sharing logs with a support team, viewing them live on a Mac, or shipping to a remote destination. Reach for one only when you have that specific need.
01 · Pulse
github.com/kean/Pulse · MIT · in active development for 6 years, 100+ releases
The one to reach for first if you're building anything network-heavy. Pulse is a native, SwiftUI-built console that lives inside your own app: it records every URLSession request (and anything routed through it, including Alamofire) and gives you a live, searchable inspector your QA team can open without Xcode attached. Pair it with the free macOS Pulse Pro app and you can view a tester's logs on your own machine in real time.
// Package.swift
.package(url: "https://github.com/kean/Pulse", from: "5.0.0")
import Pulse
import PulseUI
// Route all URLSession traffic through Pulse in one line:
URLSessionProxy.shared.isEnabled = true
Use it when
Your bugs are mostly "the API returned something weird" and you want testers to be able to show you the exact request and response, not describe it from memory.
02 · AvdLee/Diagnostics
github.com/AvdLee/Diagnostics · MIT · 1,100+ stars, actively maintained
Built by Antoine van der Lee (SwiftLee) for a simpler problem than Pulse solves: getting a complete, shareable diagnostics report out of a user's device with one tap. It bundles your app's logs, device and OS info, and UserDefaults into a single readable HTML report the user can send you by email, no reproduction steps required from them.
// Package.swift
.package(url: "https://github.com/AvdLee/Diagnostics.git", from: "6.0.0")
import Diagnostics
let reporter = DiagnosticsReporter()
let report = try reporter.generateReport()
// Present DiagnosticsReportViewController(report: report) to let the user share it
Use it when
You support non-technical users who can't describe a bug in engineering terms. "Tap this button, then send me the report" beats any set of reproduction instructions.
03 · CocoaLumberjack
github.com/CocoaLumberjack/CocoaLumberjack · BSD · 13,000+ stars, the longest-running option here
The framework most large, older codebases already have. It logs to multiple destinations at once (console, file, OSLog) asynchronously, with log levels and rotation built in. If you're maintaining an app that predates Swift's Logger, this is almost certainly what's already wired in, and it still gets regular releases.
// Podfile
pod 'CocoaLumberjack/Swift'
import CocoaLumberjackSwift
DDLog.add(DDOSLogger.sharedInstance) // routes through Apple's unified logging
DDLogInfo("User logged in successfully")
Use it when
You're on an existing codebase that already uses it, or you specifically need simultaneous file + console + remote logging with rotation, which Logger doesn't provide out of the box.
04 · SwiftyBeaver
github.com/SwiftyBeaver/SwiftyBeaver · MIT · colorful console output, optional cloud platform
The pragmatic middle ground: lighter than CocoaLumberjack, with color-coded console output that makes scanning logs during active development noticeably faster. It also has an optional paid cloud platform if you want logs shipped off-device to a dashboard, with Slack alerting on error levels.
// Podfile
pod 'SwiftyBeaver'
import SwiftyBeaver
let log = SwiftyBeaver.self
log.addDestination(ConsoleDestination())
log.warning("Cache miss for user \(id)")
Use it when
You want CocoaLumberjack-style multi-destination logging but with less ceremony, and you're open to a paid tier later if remote log aggregation becomes worth it.
05 · NSLogger
github.com/fpillet/NSLogger · BSD · in maintenance for over a decade, still works
The odd one out, and worth knowing about for a specific reason: it streams logs to a dedicated macOS viewer app over Bonjour in real time, including binary data and images, not just text. If you need to eyeball a downloaded image or a binary payload while debugging without adding a breakpoint, this is the only tool on this list built for that.
// Podfile
pod 'NSLogger/Swift'
import NSLogger
LoggerSetupBonjour(LoggerGetDefaultLogger(), nil, nil)
LogInfo("Downloaded image, \(data.count) bytes")
Use it when
You're debugging binary or image data specifically, or you want a persistent desktop log viewer running alongside Xcode instead of scrolling the console.
Which one to use
| If you need | Reach for |
|---|---|
| Network requests visible to QA | Pulse |
| One-tap shareable bug report | AvdLee/Diagnostics |
| Existing large codebase, already wired in | CocoaLumberjack |
| Fast colorful console + optional cloud | SwiftyBeaver |
| Binary/image data, real-time desktop viewer | NSLogger |
| None of the above | Just use OSLog |
The honest takeaway: most apps need zero of these. OSLog covers structured, filterable, on-device logging for free, and Console.app already shows you everything without a dependency. Reach for this list only when you hit the exact problem each one solves, logging a dependency you don't need is its own kind of technical debt.
Choosing what to add?
I help iOS teams cut through exactly this kind of tooling decision. First session is free.
Book a free 1:1 Connect on LinkedIn