OSLog
是苹果在 macOS 10.15(Catalina)和 iOS 15 引入的一个用于记录系统日志的新框架。它提供了一种现代化的方式来记录应用程序的日志,并且与系统日志服务集成得非常好。
在SwiftUI 应用中使用有2种常见的模式:
属性包装器(Property Wrapper)
import os.log
@propertyWrapper
struct AppLog {
private let logger: Logger
init(subsystem: String = "com.example.MyApp", category: String = "defaultCategory") {
self.logger = Logger(subsystem: subsystem, category: category)
}
var wrappedValue: Logger {
return logger
}
}
struct MyViewModel {
@AppLog(subsystem: "com.example.MyApp", category: "MyCategory")
private var logger
func doSomething() {
// 记录日志消息
logger.log("This is a log message")
}
}
环境变量
// applogger.swift
import Foundation
import SwiftUI
import os.log
private struct LoggerEnvironmentKey: EnvironmentKey {
static let defaultValue: Logger = Logger(subsystem: subsystem, category: "main")
}
extension EnvironmentValues {
var logger : Logger {
get { self[LoggerEnvironmentKey.self] }
set { self[LoggerEnvironmentKey.self] = newValue }
}
}
// App.swift
Settings {
SettingsView()
}
.environment(\.logger, logger)
// someView.swift
import SwiftUI
import os.log
struct ContentView: View {
@Environment(\.logger) private var logger: Logger // 访问共享日志器
var body: some View {
Text("Hello, World!")
.onAppear {
logger.info("ContentView appeared")
}
}
}
总结
两种方法都很方便,但是推荐第一种,第一种可以不用每次引入 OSLog,可以设置默认值,在需要区分的时候 再用参数区分