Skip to content

Commit 25c0e17

Browse files
committed
Pass in a logger instead of LogType.
1 parent 2929082 commit 25c0e17

File tree

13 files changed

+74
-69
lines changed

13 files changed

+74
-69
lines changed

demos/supabase-todolist/lib/powersync.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ Future<String> getDatabasePath() async {
151151

152152
Future<void> openDatabase() async {
153153
// Open the local database
154-
db = PowerSyncDatabase(schema: schema, path: await getDatabasePath());
154+
db = PowerSyncDatabase(
155+
schema: schema, path: await getDatabasePath(), logger: attachedLogger);
155156
await db.initialize();
156157

157158
await loadSupabase();

packages/powersync/lib/powersync.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ export 'src/crud.dart';
1010
export 'src/sync_status.dart';
1111
export 'src/uuid.dart';
1212
export 'src/open_factory.dart';
13+
export 'src/log.dart' show attachedLogger, autoLogger, debugLogger;

packages/powersync/lib/src/log.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,46 @@ const bool kReleaseMode = bool.fromEnvironment('dart.vm.product');
55
const bool kProfileMode = bool.fromEnvironment('dart.vm.profile');
66
const bool kDebugMode = !kReleaseMode && !kProfileMode;
77

8+
// Implementation note: The loggers here are only initialized if used - it adds
9+
// no overhead when not used in the client app.
10+
811
final isolateLogger = Logger.detached('PowerSync');
12+
13+
/// Logger that outputs to the console in debug mode, and nothing
14+
/// in release and profile modes.
15+
final Logger autoLogger = _makeAutoLogger();
16+
17+
/// Logger that always outputs debug info to the console.
18+
final Logger debugLogger = _makeDebugLogger();
19+
20+
/// Standard logger. Does not automatically log to the console,
21+
/// use the `Logger.root.onRecord` stream to get log messages.
22+
final Logger attachedLogger = Logger('PowerSync');
23+
24+
Logger _makeDebugLogger() {
25+
// Use a detached logger to log directly to the console
26+
final logger = Logger.detached('PowerSync');
27+
logger.level = Level.FINE;
28+
logger.onRecord.listen((record) {
29+
print(
30+
'[${record.loggerName}] ${record.level.name}: ${record.time}: ${record.message}');
31+
32+
if (record.error != null) {
33+
print(record.error);
34+
}
35+
if (record.stackTrace != null) {
36+
print(record.stackTrace);
37+
}
38+
});
39+
return logger;
40+
}
41+
42+
Logger _makeAutoLogger() {
43+
if (kDebugMode) {
44+
return _makeDebugLogger();
45+
} else {
46+
final logger = Logger.detached('PowerSync');
47+
logger.level = Level.OFF;
48+
return logger;
49+
}
50+
}

packages/powersync/lib/src/powersync_database.dart

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ class PowerSyncDatabase with SqliteQueries implements SqliteConnection {
6868
/// null when disconnected, present when connecting or connected
6969
AbortController? _disconnecter;
7070

71-
/// The Logger internally used by this PowerSyncDatabase
71+
/// The Logger used by this [PowerSyncDatabase].
72+
///
73+
/// The default is [autoLogger], which logs to the console in debug builds.
74+
/// Use [debugLogger] to always log to the console.
75+
/// Use [attachedLogger] to propagate logs to [Logger.root] for custom logging.
7276
late final Logger logger;
7377

7478
/// Open a [PowerSyncDatabase].
@@ -83,17 +87,20 @@ class PowerSyncDatabase with SqliteQueries implements SqliteConnection {
8387
/// from the last committed write transaction.
8488
///
8589
/// A maximum of [maxReaders] concurrent read transactions are allowed.
90+
///
91+
/// [logger] defaults to [autoLogger], which logs to the console in debug builds.
8692
factory PowerSyncDatabase(
8793
{required Schema schema,
8894
required String path,
8995
int maxReaders = SqliteDatabase.defaultMaxReaders,
90-
LogType log = LogType.auto,
96+
Logger? logger,
9197
@Deprecated("Use [PowerSyncDatabase.withFactory] instead")
9298
// ignore: deprecated_member_use_from_same_package
9399
SqliteConnectionSetup? sqliteSetup}) {
94100
// ignore: deprecated_member_use_from_same_package
95101
var factory = PowerSyncOpenFactory(path: path, sqliteSetup: sqliteSetup);
96-
return PowerSyncDatabase.withFactory(factory, schema: schema, log: log);
102+
return PowerSyncDatabase.withFactory(factory,
103+
schema: schema, logger: logger);
97104
}
98105

99106
/// Open a [PowerSyncDatabase] with a [PowerSyncOpenFactory].
@@ -102,53 +109,33 @@ class PowerSyncDatabase with SqliteQueries implements SqliteConnection {
102109
/// additional logic to run inside the database isolate before or after opening.
103110
///
104111
/// Subclass [PowerSyncOpenFactory] to add custom logic to this process.
112+
///
113+
/// [logger] defaults to [autoLogger], which logs to the console in debug builds.
105114
factory PowerSyncDatabase.withFactory(
106115
PowerSyncOpenFactory openFactory, {
107116
required Schema schema,
108117
int maxReaders = SqliteDatabase.defaultMaxReaders,
109-
LogType log = LogType.auto,
118+
Logger? logger,
110119
}) {
111120
final db = SqliteDatabase.withFactory(openFactory, maxReaders: maxReaders);
112121
return PowerSyncDatabase.withDatabase(
113-
schema: schema, database: db, log: log);
122+
schema: schema, database: db, logger: logger);
114123
}
115124

116125
/// Open a PowerSyncDatabase on an existing [SqliteDatabase].
117126
///
118127
/// Migrations are run on the database when this constructor is called.
128+
///
129+
/// [logger] defaults to [autoLogger], which logs to the console in debug builds.
119130
PowerSyncDatabase.withDatabase({
120131
required this.schema,
121132
required this.database,
122-
LogType log = LogType.auto,
133+
Logger? logger,
123134
}) {
124-
if (log == LogType.debug || log == LogType.auto) {
125-
// Use a detached logger to log directly to the console
126-
logger = Logger.detached('PowerSync');
127-
128-
final debug = log == LogType.debug || kDebugMode;
129-
if (debug) {
130-
logger.level = Level.FINE;
131-
logger.onRecord.listen((record) {
132-
print(
133-
'[${record.loggerName}] ${record.level.name}: ${record.time}: ${record.message}');
134-
135-
if (record.error != null) {
136-
print(record.error);
137-
}
138-
if (record.stackTrace != null) {
139-
print(record.stackTrace);
140-
}
141-
});
142-
} else {
143-
logger.level = Level.OFF;
144-
}
145-
} else if (log == LogType.logger) {
146-
// Standard logger. The app is responsible for adding an onRecord listener
147-
// on the root logger.
148-
logger = Logger('PowerSync');
135+
if (logger != null) {
136+
this.logger = logger;
149137
} else {
150-
// Should not happen
151-
logger = Logger.detached('PowerSync');
138+
this.logger = autoLogger;
152139
}
153140

154141
updates = database.updates
@@ -643,15 +630,3 @@ Future<void> _powerSyncDatabaseIsolate(
643630
throw error;
644631
});
645632
}
646-
647-
enum LogType {
648-
/// Log to the console, with FINE level in debug mode, no logs in release mode
649-
auto,
650-
651-
/// Always log to the console with FINE level
652-
debug,
653-
654-
/// Uses a Logger instance.
655-
/// Use Logger.root.onRecord to handle log messages
656-
logger,
657-
}

packages/powersync/test/bucket_storage_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ const removeAsset1_5 = OplogEntry(
3838
opId: '5', op: OpType.remove, rowType: 'assets', rowId: 'O1', checksum: 5);
3939

4040
void main() {
41-
setupLogger();
42-
4341
group('Bucket Storage Tests', () {
4442
late PowerSyncDatabase powersync;
4543
late sqlite.Database db;

packages/powersync/test/crud_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import 'util.dart';
77
const testId = "2290de4f-0488-4e50-abed-f8e8eb1d0b42";
88

99
void main() {
10-
setupLogger();
11-
1210
group('CRUD Tests', () {
1311
late PowerSyncDatabase powersync;
1412
late String path;

packages/powersync/test/offline_online_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ Schema makeSchema(bool online) {
6868
}
6969

7070
void main() {
71-
setupLogger();
72-
7371
group('Offline-online Tests', () {
7472
late String path;
7573

packages/powersync/test/performance_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ const pschema = Schema([
1818
]);
1919

2020
void main() {
21-
setupLogger();
22-
2321
group('Performance Tests', () {
2422
late String path;
2523

packages/powersync/test/powersync_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import 'package:sqlite_async/sqlite3.dart' as sqlite;
88
import 'util.dart';
99

1010
void main() {
11-
setupLogger();
12-
1311
group('Basic Tests', () {
1412
late String path;
1513

packages/powersync/test/stream_test.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ import 'package:http/http.dart';
66
import 'package:powersync/src/stream_utils.dart';
77
import 'package:test/test.dart';
88

9-
import 'util.dart';
10-
119
void main() {
12-
setupLogger();
13-
1410
group('Stream Tests', () {
1511
setUp(() async {});
1612

0 commit comments

Comments
 (0)