delete DLog and make LogRepository not a singleton

This commit is contained in:
bwees 2025-08-04 17:11:46 -05:00
parent 76dc2ad181
commit 33bbb8d3e2
No known key found for this signature in database
8 changed files with 5 additions and 149 deletions

View File

@ -6,7 +6,6 @@ import 'package:immich_mobile/infrastructure/repositories/local_album.repository
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
import 'package:logging/logging.dart';
class HashService {
@ -46,7 +45,6 @@ class HashService {
stopwatch.stop();
_log.info("Hashing took - ${stopwatch.elapsedMilliseconds}ms");
DLog.log("Hashing took - ${stopwatch.elapsedMilliseconds}ms");
}
/// Processes a list of [LocalAsset]s, storing their hash and updating the assets in the DB
@ -101,7 +99,6 @@ class HashService {
}
_log.fine("Hashed ${hashed.length}/${toHash.length} assets");
DLog.log("Hashed ${hashed.length}/${toHash.length} assets");
await _localAssetRepository.updateHashes(hashed);
}

View File

@ -6,7 +6,6 @@ import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
import 'package:immich_mobile/utils/diff.dart';
import 'package:logging/logging.dart';
import 'package:platform/platform.dart';
@ -30,19 +29,17 @@ class LocalSyncService {
try {
if (full || await _nativeSyncApi.shouldFullSync()) {
_log.fine("Full sync request from ${full ? "user" : "native"}");
DLog.log("Full sync request from ${full ? "user" : "native"}");
return await fullSync();
}
final delta = await _nativeSyncApi.getMediaChanges();
if (!delta.hasChanges) {
_log.fine("No media changes detected. Skipping sync");
DLog.log("No media changes detected. Skipping sync");
return;
}
DLog.log("Delta updated: ${delta.updates.length}");
DLog.log("Delta deleted: ${delta.deletes.length}");
_log.fine("Delta updated: ${delta.updates.length}");
_log.fine("Delta deleted: ${delta.deletes.length}");
final deviceAlbums = await _nativeSyncApi.getAlbums();
await _localAlbumRepository.updateAll(deviceAlbums.toLocalAlbums());
@ -83,7 +80,6 @@ class LocalSyncService {
} finally {
stopwatch.stop();
_log.info("Device sync took - ${stopwatch.elapsedMilliseconds}ms");
DLog.log("Device sync took - ${stopwatch.elapsedMilliseconds}ms");
}
}
@ -106,7 +102,6 @@ class LocalSyncService {
await _nativeSyncApi.checkpointSync();
stopwatch.stop();
_log.info("Full device sync took - ${stopwatch.elapsedMilliseconds}ms");
DLog.log("Full device sync took - ${stopwatch.elapsedMilliseconds}ms");
} catch (e, s) {
_log.severe("Error performing full device sync", e, s);
}
@ -150,7 +145,6 @@ class LocalSyncService {
// Faster path - only new assets added
if (await checkAddition(dbAlbum, deviceAlbum)) {
_log.fine("Fast synced device album ${dbAlbum.name}");
DLog.log("Fast synced device album ${dbAlbum.name}");
return true;
}

View File

@ -3,7 +3,6 @@ import 'dart:async';
import 'package:immich_mobile/domain/models/sync_event.model.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_api.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_stream.repository.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
import 'package:logging/logging.dart';
import 'package:openapi/api.dart';
@ -26,7 +25,6 @@ class SyncStreamService {
Future<void> sync() {
_logger.info("Remote sync request for user");
DLog.log("Remote sync request for user");
// Start the sync stream and handle events
return _syncApiRepository.streamChanges(_handleEvents);
}

View File

@ -9,20 +9,6 @@ class LogRepository {
final DriftLogger _db;
const LogRepository(this._db);
static LogRepository? instance;
static LogRepository init(DriftLogger db) {
if (instance != null) {
throw "LogRepository already initialized";
}
instance = LogRepository(db);
return instance!;
}
static LogRepository? getInstance() {
return instance;
}
Future<bool> deleteAll() async {
await _db.logMessageEntity.deleteAll();
return true;

View File

@ -4,7 +4,6 @@ import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/sync_event.model.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:logging/logging.dart';
import 'package:openapi/api.dart';
@ -107,7 +106,6 @@ class SyncApiRepository {
}
stopwatch.stop();
_logger.info("Remote Sync completed in ${stopwatch.elapsed.inMilliseconds}ms");
DLog.log("Remote Sync completed in ${stopwatch.elapsed.inMilliseconds}ms");
}
List<SyncEvent> _parseLines(List<String> lines) {

View File

@ -1,59 +0,0 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/models/log.model.dart';
import 'package:immich_mobile/infrastructure/repositories/log.repository.dart';
const kDevLoggerTag = 'DEV';
abstract final class DLog {
const DLog();
static Stream<List<LogMessage>> watchLog() {
final logger = LogRepository.getInstance();
if (logger == null) {
return const Stream.empty();
}
return logger.watchMessages(kDevLoggerTag);
}
static void clearLog() {
final db = LogRepository.getInstance();
if (db == null) {
return;
}
unawaited(db.deleteByLogger(kDevLoggerTag));
}
static void log(String message, [Object? error, StackTrace? stackTrace]) {
if (!Platform.environment.containsKey('FLUTTER_TEST')) {
debugPrint('[$kDevLoggerTag] [${DateTime.now()}] $message');
}
if (error != null) {
debugPrint('Error: $error');
}
if (stackTrace != null) {
debugPrint('StackTrace: $stackTrace');
}
final logger = LogRepository.getInstance();
if (logger == null) {
return;
}
final record = LogMessage(
message: message,
level: LogLevel.info,
createdAt: DateTime.now(),
logger: kDevLoggerTag,
error: error?.toString(),
stack: stackTrace?.toString(),
);
unawaited(logger.insert(record));
}
}

View File

@ -2,19 +2,16 @@ import 'dart:async';
import 'package:auto_route/auto_route.dart';
import 'package:drift/drift.dart' hide Column;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/theme_extensions.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:logging/logging.dart';
final _features = [
_Feature(
@ -37,7 +34,7 @@ final _features = [
DriftAssetSelectionTimelineRoute(lockedSelectionAssets: assets.toSet()),
);
DLog.log("Selected ${selectedAssets?.length ?? 0} assets");
Logger("FeaturesInDevelopment").fine("Selected ${selectedAssets?.length ?? 0} assets");
return Future.value();
},
@ -159,7 +156,6 @@ class FeatInDevPage extends StatelessWidget {
),
),
const Divider(height: 0),
const Flexible(child: _DevLogs()),
],
),
);
@ -174,57 +170,3 @@ class _Feature {
final TextStyle? style;
final Future<void> Function(BuildContext, WidgetRef _) onTap;
}
class _DevLogs extends StatelessWidget {
const _DevLogs();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
actions: [
IconButton(
onPressed: DLog.clearLog,
icon: Icon(
Icons.delete_outline_rounded,
size: 20.0,
color: context.primaryColor,
semanticLabel: "Clear logs",
),
),
],
centerTitle: true,
),
body: StreamBuilder(
initialData: [],
stream: DLog.watchLog(),
builder: (_, logMessages) {
return ListView.separated(
itemBuilder: (ctx, index) {
final logMessage = logMessages.data![index];
return ListTile(
title: Text(
logMessage.message,
style: TextStyle(color: ctx.colorScheme.onSurface, fontSize: 14.0, overflow: TextOverflow.ellipsis),
),
subtitle: Text(
"at ${DateFormat("HH:mm:ss.SSS").format(logMessage.createdAt)}",
style: TextStyle(color: ctx.colorScheme.onSurfaceSecondary, fontSize: 12.0),
),
dense: true,
visualDensity: VisualDensity.compact,
tileColor: Colors.transparent,
minLeadingWidth: 10,
);
},
separatorBuilder: (_, index) {
return const Divider(height: 0);
},
itemCount: logMessages.data?.length ?? 0,
);
},
),
);
}
}

View File

@ -54,7 +54,7 @@ abstract final class Bootstrap {
await StoreService.init(storeRepository: IsarStoreRepository(db));
await LogService.init(
logRepository: LogRepository.init(loggerDb),
logRepository: LogRepository(loggerDb),
storeRepository: IsarStoreRepository(db),
shouldBuffer: shouldBufferLogs,
);