diff --git a/Package.resolved b/Package.resolved index 419fc30f..9f0890bf 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "41f93013537f670f4fe1a235c318bee33b54528c76e4b1dd2a7675bea6c0bcde", + "originHash" : "304d466276246f5a92193f48a820d92e6955bc27033dd7e4d0d55170643acec5", "pins" : [ { "identity" : "combine-schedulers", diff --git a/Package.swift b/Package.swift index 8e87eb48..a17c1054 100644 --- a/Package.swift +++ b/Package.swift @@ -24,7 +24,11 @@ let package = Package( .trait( name: "SQLiteDataTagged", description: "Introduce SQLiteData conformances to the swift-tagged package." - ) + ), + .trait( + name: "SQLiteDataSwiftLog", + description: "Use swift-log instead of OSLog for logging." + ), ], dependencies: [ .package(url: "https://github.com/apple/swift-collections", from: "1.0.0"), @@ -44,6 +48,7 @@ let package = Package( ), .package(url: "https://github.com/pointfreeco/swift-tagged", from: "0.10.0"), .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.5.0"), + .package(url: "https://github.com/apple/swift-log", from: "1.6.0") ], targets: [ .target( @@ -62,6 +67,11 @@ let package = Package( package: "swift-tagged", condition: .when(traits: ["SQLiteDataTagged"]) ), + .product( + name: "Logging", + package: "swift-log", + condition: .when(traits: ["SQLiteDataSwiftLog"]) + ) ] ), .target( diff --git a/Sources/SQLiteData/CloudKit/Internal/Logging.swift b/Sources/SQLiteData/CloudKit/Internal/Logging.swift index b7d4b214..9701475f 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Logging.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Logging.swift @@ -1,10 +1,47 @@ -#if DEBUG && canImport(CloudKit) +#if canImport(CloudKit) + +#if SQLiteDataSwiftLog + @_exported import struct Logging.Logger + import protocol Logging.LogHandler + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine { + public typealias Logger = Logging.Logger + } + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine.Logger { + public static var `default`: SyncEngine.Logger { + .init(label: "SQLiteData") + } + public static var disabled: SyncEngine.Logger { + .init(label: "SQLiteData") { _ in DisabledLogHandler() } + } + } +#else + @_exported import struct os.Logger + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine { + public typealias Logger = os.Logger + } + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine.Logger { + public static var `default`: SyncEngine.Logger { + .init(subsystem: "SQLiteData", category: "CloudKit") + } + public static var disabled: SyncEngine.Logger { + .init(.disabled) + } + } +#endif + +#if DEBUG import CloudKit import TabularData import os @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) - extension Logger { + extension SyncEngine.Logger { func log(_ event: SyncEngine.Event, syncEngine: any SyncEngineProtocol) { let prefix = "SQLiteData (\(syncEngine.database.databaseScope.label).db)" var actions: [String] = [] @@ -302,3 +339,25 @@ } } #endif + +#if SQLiteDataSwiftLog + struct DisabledLogHandler: Logging.LogHandler { + var logLevel: Logging.Logger.Level = .info + var metadata: Logging.Logger.Metadata = [:] + subscript(metadataKey key: String) -> Logging.Logger.Metadata.Value? { + get { self.metadata[key] } + set { self.metadata[key] = newValue } + } + func log( + level: Logging.Logger.Level, + message: Logging.Logger.Message, + metadata: Logging.Logger.Metadata?, + source: String, + file: String, + function: String, + line: UInt + ) {} + } +#endif + +#endif diff --git a/Sources/SQLiteData/CloudKit/SyncEngine.swift b/Sources/SQLiteData/CloudKit/SyncEngine.swift index 72595053..2926308b 100644 --- a/Sources/SQLiteData/CloudKit/SyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/SyncEngine.swift @@ -3,7 +3,6 @@ import ConcurrencyExtras import Dependencies import OrderedCollections - import OSLog import Observation import StructuredQueriesCore import SwiftData @@ -90,8 +89,7 @@ defaultZone: CKRecordZone = CKRecordZone(zoneName: "co.pointfree.SQLiteData.defaultZone"), startImmediately: Bool = true, delegate: (any SyncEngineDelegate)? = nil, - logger: Logger = isTesting - ? Logger(.disabled) : Logger(subsystem: "SQLiteData", category: "CloudKit") + logger: Logger = isTesting ? Logger.disabled : Logger.default ) throws where repeat (each T1).PrimaryKey.QueryOutput: IdentifierStringConvertible, diff --git a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift index 4aec1bc8..e828f0e4 100644 --- a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift +++ b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift @@ -218,7 +218,7 @@ extension SyncEngine { ) }, userDatabase: userDatabase, - logger: Logger(.disabled), + logger: Logger.disabled, delegate: delegate, tables: tables, privateTables: privateTables