@@ -2,45 +2,60 @@ import OSLog
22
33/// A log writer which prints to the standard output
44///
5- /// This writer uses `os.Logger` on iOS 14+ and falls back to `print` for earlier versions.
5+ /// This writer uses `os.Logger` on iOS/macOS/tvOS/watchOS 14+ and falls back to `print` for earlier versions.
66public class PrintLogWriter : LogWriterProtocol {
77
8+ private let subsystem : String
9+ private let category : String
10+ private lazy var logger : Any ? = {
11+ if #available( iOS 14 . 0 , macOS 11 . 0 , tvOS 14 . 0 , watchOS 7 . 0 , * ) {
12+ return Logger ( subsystem: subsystem, category: category)
13+ }
14+ return nil
15+ } ( )
16+
17+ /// Creates a new PrintLogWriter
18+ /// - Parameters:
19+ /// - subsystem: The subsystem identifier (typically reverse DNS notation of your app)
20+ /// - category: The category within your subsystem
21+ public init ( subsystem: String = Bundle . main. bundleIdentifier ?? " com.powersync.logger " ,
22+ category: String = " default " ) {
23+ self . subsystem = subsystem
24+ self . category = category
25+ }
26+
827 /// Logs a message with a given severity and optional tag.
9- ///
10- /// - Parameters:
11- /// - severity: The severity level of the message.
12- /// - message: The content of the log message.
13- /// - tag: An optional tag used to categorize the message. If empty, no brackets are shown.
28+ /// - Parameters:
29+ /// - severity: The severity level of the message.
30+ /// - message: The content of the log message.
31+ /// - tag: An optional tag used to categorize the message. If empty, no brackets are shown.
1432 public func log( severity: LogSeverity , message: String , tag: String ? ) {
15- let tagPrefix : String
16- if let tag, !tag. isEmpty {
17- tagPrefix = " [ \( tag) ] "
18- } else {
19- tagPrefix = " "
20- }
33+ let tagPrefix = tag. map { !$0. isEmpty ? " [ \( $0) ] " : " " } ?? " "
34+ let formattedMessage = " \( tagPrefix) \( message) "
2135
22- let message = " \( tagPrefix) \( message) "
23- if #available( iOS 14 . 0 , * ) {
24- let l = Logger ( )
36+ if #available( iOS 14 . 0 , macOS 11 . 0 , tvOS 14 . 0 , watchOS 7 . 0 , * ) {
37+ guard let logger = logger as? Logger else { return }
2538
2639 switch severity {
27- case . info:
28- l . info ( " \( message ) " )
29- case . error:
30- l . error ( " \( message ) " )
31- case . debug:
32- l . debug ( " \( message ) " )
33- case . warning:
34- l . warning ( " \( message ) " )
35- case . fault:
36- l . fault ( " \( message ) " )
40+ case . info:
41+ logger . info ( " \( formattedMessage , privacy : . public ) " )
42+ case . error:
43+ logger . error ( " \( formattedMessage , privacy : . public ) " )
44+ case . debug:
45+ logger . debug ( " \( formattedMessage , privacy : . public ) " )
46+ case . warning:
47+ logger . warning ( " \( formattedMessage , privacy : . public ) " )
48+ case . fault:
49+ logger . fault ( " \( formattedMessage , privacy : . public ) " )
3750 }
3851 } else {
39- print ( " \( severity. stringValue) : \( message ) " )
52+ print ( " \( severity. stringValue) : \( formattedMessage ) " )
4053 }
4154 }
4255}
4356
57+
58+
4459/// A default logger configuration that uses `PrintLogWritter` and filters messages by minimum severity.
4560public class DefaultLogger : LoggerProtocol {
4661 public var minSeverity : LogSeverity
0 commit comments