Skip to content

Instantly share code, notes, and snippets.

@adammagana
Last active September 5, 2023 20:29
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adammagana/bf701c115a654abff57c6d46b835f008 to your computer and use it in GitHub Desktop.
Save adammagana/bf701c115a654abff57c6d46b835f008 to your computer and use it in GitHub Desktop.
A convenient Swift protocol and wrapper for OSLog.
import os
private let subsystem = "<ENTER-YOUR-SUBSYSTEM-STRING-HERE>"
// MARK: - Protocol
protocol LogProducer {
func debug(_ message: StaticString, _ messageArguments: CVarArg...)
func info(_ message: StaticString, _ messageArguments: CVarArg...)
func warn(_ message: StaticString, _ messageArguments: CVarArg...)
func fault(_ message: StaticString, _ messageArguments: CVarArg...)
func error(_ message: StaticString, _ messageArguments: CVarArg...)
}
// MARK: - Implementation
/// A convenience wrapper for `OSLog`
struct Logger: LogProducer {
private let log: OSLog
init(_ category: String) {
self.log = OSLog(subsystem: subsystem, category: category)
}
// MARK: Log Methods
// LOL, this method sucks ATM since Swift doesn't allow the forwarding of variadic params.
private func log(_ message: StaticString, _ type: OSLogType, _ messageArguments: [CVarArg]) {
switch messageArguments.count {
case 0:
os_log(message, log: log, type: type)
case 1:
os_log(message, log: log, type: type, messageArguments[0])
case 2:
os_log(message, log: log, type: type, messageArguments[0], messageArguments[1])
case 3:
os_log(message, log: log, type: type, messageArguments[0], messageArguments[1], messageArguments[2])
case 4:
os_log(message, log: log, type: type, messageArguments[0], messageArguments[1], messageArguments[2], messageArguments[3])
case 5:
os_log(message, log: log, type: type, messageArguments[0], messageArguments[1], messageArguments[2], messageArguments[3], messageArguments[4])
default:
os_log("Too many variadic params were sent to the logger so we tossed them!", log: log, type: .error)
os_log(message, log: log, type: type)
}
}
func debug(_ message: StaticString, _ messageArguments: CVarArg...) {
log(message, .debug, messageArguments)
}
func info(_ message: StaticString, _ messageArguments: CVarArg...) {
log(message, .info, messageArguments)
}
func warn(_ message: StaticString, _ messageArguments: CVarArg...) {
log(message, .default, messageArguments)
}
func fault(_ message: StaticString, _ messageArguments: CVarArg...) {
log(message, .fault, messageArguments)
}
func error(_ message: StaticString, _ messageArguments: CVarArg...) {
log(message, .error, messageArguments)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment