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 <alex.tran1502@gmail.com>
This commit is contained in:
Brandon Wees 2025-08-06 10:49:29 -05:00 committed by GitHub
parent f2067221c5
commit 3cd7f5ab90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 879 additions and 1563 deletions

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,
);
},
),
);
}
}