advplyr.audiobookshelf-app/ios/App/Shared/util/Logger.swift

72 lines
2.4 KiB
Swift

//
// AppLogger.swift
// AppLogger
//
// Created by Fernando Fernandes on 29.06.20.
//
import Foundation
import os
/// Logs app info by using the newest Swift unified logging APIs.
///
/// Reference:
/// - [Explore logging in Swift (WWDC20)](https://developer.apple.com/wwdc20/10168)
/// - [Unified Logging](https://developer.apple.com/documentation/os/logging)
/// - [OSLog](https://developer.apple.com/documentation/os/oslog)
/// - [Logger](https://developer.apple.com/documentation/os/logger)
public struct AppLogger {
// MARK: - Properties
/// Default values used by the `AppLogger`.
public struct Defaults {
public static let subsystem = Bundle.main.bundleIdentifier ?? "ABS"
public static let category = "default"
public static let isPrivate = false
}
// MARK: - Private Properties
private let logger: Logger
// MARK: - Lifecycle
/// Creates an `AppLogger` instance.
///
/// - Parameters:
/// - subsystem: `String`. Organizes large topic areas within the app or apps. For example, you might define
/// a subsystem for each process that you create. The default is `Bundle.main.bundleIdentifier ?? "AppLogger"`.
/// - category: `String`. Within a `subsystem`, you define categories to further distinguish parts of that
/// subsystem. For example, if you used a single subsystem for your app, you might create separate categories for
/// model code and user-interface code. In a game, you might use categories to distinguish between physics, AI,
/// world simulation, and rendering. The default is `default`.
public init(subsystem: String = Defaults.subsystem, category: String = Defaults.category) {
self.logger = Logger(subsystem: subsystem, category: category)
}
}
// MARK: - Interface
public extension AppLogger {
func log(_ information: String, isPrivate: Bool = Defaults.isPrivate) {
if isPrivate {
logger.log("\(information, privacy: .private)")
} else {
logger.log("\(information, privacy: .public)")
}
}
func error(_ information: String, isPrivate: Bool = Defaults.isPrivate) {
if isPrivate {
logger.error("\(information, privacy: .private)")
} else {
logger.error("\(information, privacy: .public)")
}
}
func error(_ error: Error) {
logger.error("\(String(describing: error))")
}
}