Skip to content

Commit 92f3bae

Browse files
committed
Logging change poc
1 parent df044ec commit 92f3bae

3 files changed

Lines changed: 76 additions & 13 deletions

File tree

PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3591
public 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>

PowerSync/PowerSync.Common/Client/Sync/Stream/StreamingSyncImplementation.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -876,10 +876,7 @@ protected void UpdateSyncStatus(SyncStatusOptions options, UpdateSyncStatusOptio
876876

877877
private async Task DelayRetry()
878878
{
879-
if (Options.RetryDelayMs.HasValue)
880-
{
881-
await Task.Delay(Options.RetryDelayMs.Value);
882-
}
879+
await Task.Delay(Options.RetryDelayMs ?? DEFAULT_RETRY_DELAY_MS);
883880
}
884881

885882

demos/MAUITodo/Data/PowerSyncData.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ public PowerSyncData()
1919
ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
2020
{
2121
builder.AddConsole();
22-
builder.SetMinimumLevel(LogLevel.Error);
22+
builder.AddFilter("PowerSync.Database", LogLevel.Information);
23+
builder.AddFilter("PowerSync.SyncStream", LogLevel.Information);
24+
builder.AddFilter("PowerSync.ConnectionManager", LogLevel.Information);
25+
builder.AddFilter("PowerSync.BucketStorage", LogLevel.Warning);
2326
});
24-
var logger = loggerFactory.CreateLogger("PowerSyncLogger");
2527

2628
var dbPath = Path.Combine(FileSystem.AppDataDirectory, "example.db");
2729
var factory = new MAUISQLiteDBOpenFactory(new MDSQLiteOpenFactoryOptions()
@@ -32,7 +34,7 @@ public PowerSyncData()
3234
{
3335
Database = factory,
3436
Schema = AppSchema.PowerSyncSchema,
35-
Logger = logger
37+
Loggers = new PowerSyncLoggerOptions { LoggerFactory = loggerFactory }
3638
});
3739

3840
var nodeConnector = new NodeConnector();

0 commit comments

Comments
 (0)