@@ -28,8 +28,64 @@ public class BasePowerSyncDatabaseOptions()
2828 /// </summary>
2929 public Schema Schema { get ; set ; } = null ! ;
3030
31- public ILogger ? Logger { get ; set ; } = null ! ;
31+ /// <summary>
32+ /// Creates the logger for the PowerSyncDatabase.
33+ /// </summary>
34+ [ Obsolete ( "Use Loggers.LoggerFactory instead." ) ]
35+ public ILogger ? Logger { get ; set ; }
36+
37+ /// <summary>
38+ /// Sets the logger used on a per-system level.
39+ /// </summary>
40+ public PowerSyncLoggerOptions ? Loggers { get ; set ; }
41+ }
42+
43+ public class PowerSyncLoggerOptions
44+ {
45+ /// <summary>
46+ /// Factory used to create a named logger for each subcomponent that does not have an explicit logger set.
47+ /// </summary>
48+ public ILoggerFactory ? LoggerFactory { get ; set ; }
49+
50+ // Per-component logger overrides
51+ public ILogger ? Database { get ; set ; }
52+ public ILogger ? SyncStream { get ; set ; }
53+ public ILogger ? ConnectionManager { get ; set ; }
54+ public ILogger ? BucketStorage { get ; set ; }
55+ }
56+
57+ /// <summary>
58+ /// Resolved form of <see cref="PowerSyncLoggerOptions"/> with no nullable fields.
59+ /// Each subcomponent logger is either the explicit override or a named logger created from
60+ /// <see cref="PowerSyncLoggerOptions.LoggerFactory"/>, falling back to <see cref="NullLogger.Instance"/>.
61+ /// </summary>
62+ public class ResolvedPowerSyncLoggerOptions
63+ {
64+ public ILogger Database { get ; }
65+ public ILogger SyncStream { get ; }
66+ public ILogger ConnectionManager { get ; }
67+ public ILogger BucketStorage { get ; }
3268
69+ public ResolvedPowerSyncLoggerOptions ( PowerSyncLoggerOptions ? options )
70+ {
71+ ILogger Resolve ( ILogger ? logger , string category ) =>
72+ logger ?? options ? . LoggerFactory ? . CreateLogger ( category ) ?? NullLogger . Instance ;
73+
74+ Database = Resolve ( options ? . Database , "PowerSync.Database" ) ;
75+ SyncStream = Resolve ( options ? . SyncStream , "PowerSync.SyncStream" ) ;
76+ ConnectionManager = Resolve ( options ? . ConnectionManager , "PowerSync.ConnectionManager" ) ;
77+ BucketStorage = Resolve ( options ? . BucketStorage , "PowerSync.BucketStorage" ) ;
78+ }
79+
80+ // Used by deprecated PowerSyncDatabaseOptions.Logger option
81+ public ResolvedPowerSyncLoggerOptions ( ILogger logger )
82+ {
83+ // Set all components to use the same instance.
84+ Database = logger ;
85+ SyncStream = logger ;
86+ ConnectionManager = logger ;
87+ BucketStorage = logger ;
88+ }
3389}
3490
3591public interface IDatabaseSource { }
@@ -156,7 +212,8 @@ public class PowerSyncDatabase : IPowerSyncDatabase
156212
157213 protected CancellationTokenSource ? syncStreamStatusCts ;
158214
159- public ILogger Logger { get ; protected set ; }
215+ protected ResolvedPowerSyncLoggerOptions Loggers { get ; }
216+ public ILogger Logger => Loggers . Database ;
160217
161218 private readonly AsyncLock runExclusive = new ( ) ;
162219 private readonly Func < IPowerSyncBackendConnector , Remote > remoteFactory ;
@@ -192,7 +249,14 @@ public PowerSyncDatabase(PowerSyncDatabaseOptions options)
192249 {
193250 throw new ArgumentException ( "The provided `Database` option is invalid." ) ;
194251 }
195- Logger = options . Logger ?? NullLogger . Instance ;
252+
253+ // Ignore deprecation warning
254+ #pragma warning disable CS0618
255+ Loggers = options . Logger != null
256+ ? new ResolvedPowerSyncLoggerOptions ( options . Logger )
257+ : new ResolvedPowerSyncLoggerOptions ( options . Loggers ) ;
258+ #pragma warning restore CS0618
259+
196260 CurrentStatus = new SyncStatus ( new SyncStatusOptions ( ) ) ;
197261 BucketStorageAdapter = generateBucketStorageAdapter ( ) ;
198262
@@ -230,7 +294,7 @@ public PowerSyncDatabase(PowerSyncDatabaseOptions options)
230294 RetryDelayMs = options . RetryDelayMs ,
231295 Subscriptions = options . Subscriptions ,
232296 CrudUploadThrottleMs = options . CrudUploadThrottleMs ,
233- Logger = Logger
297+ Logger = Loggers . SyncStream
234298 } ) ;
235299
236300 var syncStreamStatusCts = CancellationTokenSource . CreateLinkedTokenSource ( masterCts . Token ) ;
@@ -250,14 +314,14 @@ public PowerSyncDatabase(PowerSyncDatabaseOptions options)
250314 await syncStreamImplementation . WaitForReady ( ) ;
251315 return new ConnectionManagerSyncImplementationResult ( syncStreamImplementation , ( ) => syncStreamStatusCts . Cancel ( ) ) ;
252316 }
253- } , logger : Logger ) ;
317+ } , logger : Loggers . ConnectionManager ) ;
254318
255319 IsReadyTask = Initialize ( options ) ;
256320 }
257321
258322 protected IBucketStorageAdapter generateBucketStorageAdapter ( )
259323 {
260- return new SqliteBucketStorage ( Database , Logger ) ;
324+ return new SqliteBucketStorage ( Database , Loggers . BucketStorage ) ;
261325 }
262326
263327 /// <summary>
0 commit comments