OSLogIt is a new framework introduced by Apple in macOS 10.15 (Catalina) and iOS 15 for recording system logs. It provides a modern way to log applications and integrates very well with the syslog service.

There are 2 common patterns used in SwiftUI applications:

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")
    }
}


environment variables

//  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")
            }
    }
}

Summarize

Both methods are very convenient, but the first one is recommended. The first one does not need to introduce OSLog every time. You can set the default value and use parameters to distinguish it when you need to distinguish it.

Leave a Reply

Your email address will not be published. Required fields are marked *