Swift:
Logging
How to:
In Swift, you can write logs to the console with print statements or the more flexible os.log
API, which hooks into the Unified Logging System on Apple platforms.
import os.log
let logger = OSLog(subsystem: "com.yourapp.domain", category: "network")
func fetchData() {
// Simple print statement
print("Fetch started")
// Logging info-level event using os.log
os_log(.info, log: logger, "Fetching data from API.")
do {
let data = try performNetworkRequest()
// Logging debug-level event
os_log(.debug, log: logger, "Data received: %@", data.description)
} catch {
// Logging error-level event
os_log(.error, log: logger, "Failed to fetch data: %@", error.localizedDescription)
}
}
func performNetworkRequest() throws -> Data {
// Simulate a network request
return Data()
}
Sample output on the console might look like this:
Fetch started
Fetching data from API.
Data received: Some data bytes...
For errors, it might be:
Failed to fetch data: The Internet connection appears to be offline.
Deep Dive
Logging in Swift takes on new power and efficiency with the Unified Logging System introduced in iOS 10 and macOS Sierra. Unlike the print
statement that goes straight to the console, this system is activity-based, and allows you to filter log messages based on their importance and whether they’re debug or release builds.
The historical context frames the evolution of logging in iOS and macOS from rudimentary print statements towards comprehensive tools that integrate with the Instruments app and Console, providing sophisticated ways to analyze logs.
There are a range of alternatives to logging within Swift, such as third-party libraries like CocoaLumberjack, which offers a macro layer over the Unified Logging System. It provides enhanced control over log formatting, file management, and performance options.
Lastly, implementation details; OSLog is designed not only to be efficient but also privacy-conscious, with the ability to obfuscate private data when logging. It categorizes logs into fault, error, info, and debug levels, each offering a different granularity for troubleshooting.