All posts

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.

Muhammad Afham · July 2026 · 4 min read

Before you add a dependency: 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 needReach for
Network requests visible to QAPulse
One-tap shareable bug reportAvdLee/Diagnostics
Existing large codebase, already wired inCocoaLumberjack
Fast colorful console + optional cloudSwiftyBeaver
Binary/image data, real-time desktop viewerNSLogger
None of the aboveJust 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