Skip to content

Commit 3cd7f5a

Browse files
bweesalextran1502
andauthored
feat: use sqlite for logging (#20414)
* feat: use drift for logging * fix: tests * feat: use the truncate limit from constants.ts as default * chore: move setupAll to top level and restructure * chore: code review changes * fix: inherits * feat: raise log line limit to 2000 * limit getAll to 250 lines * delete DLog and make LogRepository not a singleton * fix: drift build settings and `make migration` * fix: tests * remove sensitive log --------- Co-authored-by: Alex <[email protected]>
1 parent f206722 commit 3cd7f5a

23 files changed

+877
-1561
lines changed

mobile/build.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ targets:
1919
- lib/infrastructure/entities/*.dart
2020
- lib/infrastructure/entities/*.drift
2121
- lib/infrastructure/repositories/db.repository.dart
22+
- lib/infrastructure/repositories/logger_db.repository.dart
2223
drift_dev:modular:
2324
enabled: true
2425
options: *drift_options

mobile/lib/constants/constants.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const double downloadCompleted = -1;
33
const double downloadFailed = -2;
44

55
// Number of log entries to retain on app start
6-
const int kLogTruncateLimit = 250;
6+
const int kLogTruncateLimit = 2000;
77

88
// Sync
99
const int kSyncEventBatchSize = 5000;

mobile/lib/domain/services/hash.service.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:immich_mobile/infrastructure/repositories/local_album.repository
66
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
77
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
88
import 'package:immich_mobile/platform/native_sync_api.g.dart';
9-
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
109
import 'package:logging/logging.dart';
1110

1211
class HashService {
@@ -46,7 +45,6 @@ class HashService {
4645

4746
stopwatch.stop();
4847
_log.info("Hashing took - ${stopwatch.elapsedMilliseconds}ms");
49-
DLog.log("Hashing took - ${stopwatch.elapsedMilliseconds}ms");
5048
}
5149

5250
/// Processes a list of [LocalAsset]s, storing their hash and updating the assets in the DB
@@ -101,7 +99,6 @@ class HashService {
10199
}
102100

103101
_log.fine("Hashed ${hashed.length}/${toHash.length} assets");
104-
DLog.log("Hashed ${hashed.length}/${toHash.length} assets");
105102

106103
await _localAssetRepository.updateHashes(hashed);
107104
await _storageRepository.clearCache();

mobile/lib/domain/services/local_sync.service.dart

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:immich_mobile/domain/models/album/local_album.model.dart';
66
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
77
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
88
import 'package:immich_mobile/platform/native_sync_api.g.dart';
9-
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
109
import 'package:immich_mobile/utils/diff.dart';
1110
import 'package:logging/logging.dart';
1211
import 'package:platform/platform.dart';
@@ -30,19 +29,17 @@ class LocalSyncService {
3029
try {
3130
if (full || await _nativeSyncApi.shouldFullSync()) {
3231
_log.fine("Full sync request from ${full ? "user" : "native"}");
33-
DLog.log("Full sync request from ${full ? "user" : "native"}");
3432
return await fullSync();
3533
}
3634

3735
final delta = await _nativeSyncApi.getMediaChanges();
3836
if (!delta.hasChanges) {
3937
_log.fine("No media changes detected. Skipping sync");
40-
DLog.log("No media changes detected. Skipping sync");
4138
return;
4239
}
4340

44-
DLog.log("Delta updated: ${delta.updates.length}");
45-
DLog.log("Delta deleted: ${delta.deletes.length}");
41+
_log.fine("Delta updated: ${delta.updates.length}");
42+
_log.fine("Delta deleted: ${delta.deletes.length}");
4643

4744
final deviceAlbums = await _nativeSyncApi.getAlbums();
4845
await _localAlbumRepository.updateAll(deviceAlbums.toLocalAlbums());
@@ -83,7 +80,6 @@ class LocalSyncService {
8380
} finally {
8481
stopwatch.stop();
8582
_log.info("Device sync took - ${stopwatch.elapsedMilliseconds}ms");
86-
DLog.log("Device sync took - ${stopwatch.elapsedMilliseconds}ms");
8783
}
8884
}
8985

@@ -106,7 +102,6 @@ class LocalSyncService {
106102
await _nativeSyncApi.checkpointSync();
107103
stopwatch.stop();
108104
_log.info("Full device sync took - ${stopwatch.elapsedMilliseconds}ms");
109-
DLog.log("Full device sync took - ${stopwatch.elapsedMilliseconds}ms");
110105
} catch (e, s) {
111106
_log.severe("Error performing full device sync", e, s);
112107
}
@@ -150,7 +145,6 @@ class LocalSyncService {
150145
// Faster path - only new assets added
151146
if (await checkAddition(dbAlbum, deviceAlbum)) {
152147
_log.fine("Fast synced device album ${dbAlbum.name}");
153-
DLog.log("Fast synced device album ${dbAlbum.name}");
154148
return true;
155149
}
156150

mobile/lib/domain/services/log.service.dart

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:logging/logging.dart';
1414
/// writes them to a persistent [ILogRepository], and manages log levels
1515
/// via [IStoreRepository]
1616
class LogService {
17-
final IsarLogRepository _logRepository;
17+
final LogRepository _logRepository;
1818
final IsarStoreRepository _storeRepository;
1919

2020
final List<LogMessage> _msgBuffer = [];
@@ -37,7 +37,7 @@ class LogService {
3737
}
3838

3939
static Future<LogService> init({
40-
required IsarLogRepository logRepository,
40+
required LogRepository logRepository,
4141
required IsarStoreRepository storeRepository,
4242
bool shouldBuffer = true,
4343
}) async {
@@ -50,7 +50,7 @@ class LogService {
5050
}
5151

5252
static Future<LogService> create({
53-
required IsarLogRepository logRepository,
53+
required LogRepository logRepository,
5454
required IsarStoreRepository storeRepository,
5555
bool shouldBuffer = true,
5656
}) async {
@@ -85,7 +85,7 @@ class LogService {
8585

8686
if (_shouldBuffer) {
8787
_msgBuffer.add(record);
88-
_flushTimer ??= Timer(const Duration(seconds: 5), () => unawaited(flushBuffer()));
88+
_flushTimer ??= Timer(const Duration(seconds: 5), () => unawaited(_flushBuffer()));
8989
} else {
9090
unawaited(_logRepository.insert(record));
9191
}
@@ -108,20 +108,18 @@ class LogService {
108108
await _logRepository.deleteAll();
109109
}
110110

111-
void flush() {
111+
Future<void> flush() {
112112
_flushTimer?.cancel();
113-
// TODO: Rename enable this after moving to sqlite - #16504
114-
// await _flushBufferToDatabase();
113+
return _flushBuffer();
115114
}
116115

117116
Future<void> dispose() {
118117
_flushTimer?.cancel();
119118
_logSubscription.cancel();
120-
return flushBuffer();
119+
return _flushBuffer();
121120
}
122121

123-
// TOOD: Move this to private once Isar is removed
124-
Future<void> flushBuffer() async {
122+
Future<void> _flushBuffer() async {
125123
_flushTimer = null;
126124
final buffer = [..._msgBuffer];
127125
_msgBuffer.clear();

mobile/lib/domain/services/sync_stream.service.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'dart:async';
33
import 'package:immich_mobile/domain/models/sync_event.model.dart';
44
import 'package:immich_mobile/infrastructure/repositories/sync_api.repository.dart';
55
import 'package:immich_mobile/infrastructure/repositories/sync_stream.repository.dart';
6-
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
76
import 'package:logging/logging.dart';
87
import 'package:openapi/api.dart';
98

@@ -26,7 +25,6 @@ class SyncStreamService {
2625

2726
Future<void> sync() {
2827
_logger.info("Remote sync request for user");
29-
DLog.log("Remote sync request for user");
3028
// Start the sync stream and handle events
3129
return _syncApiRepository.streamChanges(_handleEvents);
3230
}
Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,29 @@
1-
import 'package:immich_mobile/domain/models/log.model.dart';
2-
import 'package:isar/isar.dart';
1+
import 'package:drift/drift.dart';
2+
import 'package:immich_mobile/infrastructure/entities/log.entity.drift.dart';
3+
import 'package:immich_mobile/domain/models/log.model.dart' as domain;
34

4-
part 'log.entity.g.dart';
5+
class LogMessageEntity extends Table {
6+
const LogMessageEntity();
57

6-
@Collection(inheritance: false)
7-
class LoggerMessage {
8-
final Id id = Isar.autoIncrement;
9-
final String message;
10-
final String? details;
11-
@Enumerated(EnumType.ordinal)
12-
final LogLevel level;
13-
final DateTime createdAt;
14-
final String? context1;
15-
final String? context2;
8+
@override
9+
String get tableName => 'logger_messages';
1610

17-
const LoggerMessage({
18-
required this.message,
19-
required this.details,
20-
this.level = LogLevel.info,
21-
required this.createdAt,
22-
required this.context1,
23-
required this.context2,
24-
});
25-
26-
LogMessage toDto() {
27-
return LogMessage(
28-
message: message,
29-
level: level,
30-
createdAt: createdAt,
31-
logger: context1,
32-
error: details,
33-
stack: context2,
34-
);
35-
}
11+
IntColumn get id => integer().autoIncrement()();
12+
TextColumn get message => text()();
13+
TextColumn get details => text().nullable()();
14+
IntColumn get level => intEnum<domain.LogLevel>()();
15+
DateTimeColumn get createdAt => dateTime()();
16+
TextColumn get logger => text().nullable()();
17+
TextColumn get stack => text().nullable()();
18+
}
3619

37-
static LoggerMessage fromDto(LogMessage log) {
38-
return LoggerMessage(
39-
message: log.message,
40-
details: log.error,
41-
level: log.level,
42-
createdAt: log.createdAt,
43-
context1: log.logger,
44-
context2: log.stack,
45-
);
46-
}
20+
extension LogMessageEntityDataDomainEx on LogMessageEntityData {
21+
domain.LogMessage toDto() => domain.LogMessage(
22+
message: message,
23+
level: level,
24+
createdAt: createdAt,
25+
logger: logger,
26+
error: details,
27+
stack: stack,
28+
);
4729
}

0 commit comments

Comments
 (0)