improve error logging

This commit is contained in:
Fabian Freund
2025-06-29 21:00:43 +02:00
parent 920c237112
commit c93d722d3f
4 changed files with 60 additions and 1 deletions
+13 -1
View File
@@ -1,3 +1,15 @@
import 'package:logger/logger.dart';
final logger = Logger();
class _DebugLogFilter extends LogFilter {
@override
bool shouldLog(LogEvent event) {
//Log all events
return true;
}
}
final loggerMemory = MemoryOutput(
bufferSize: 255,
secondOutput: ConsoleOutput(),
);
final logger = Logger(filter: _DebugLogFilter(), output: loggerMemory);
@@ -1,9 +1,11 @@
import 'package:fading_scroll/fading_scroll.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:nullability/nullability.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart';
import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart';
import 'package:weblibre/features/settings/presentation/widgets/bang_icon.dart';
@@ -13,6 +15,7 @@ import 'package:weblibre/features/user/data/models/general_settings.dart';
import 'package:weblibre/features/user/domain/providers.dart';
import 'package:weblibre/features/user/domain/repositories/cache.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/utils/ui_helper.dart';
class GeneralSettingsScreen extends HookConsumerWidget {
const GeneralSettingsScreen({super.key});
@@ -260,6 +263,35 @@ class GeneralSettingsScreen extends HookConsumerWidget {
);
},
),
CustomListTile(
title: 'Error Logs',
subtitle: 'Copy logs for issue reporting',
prefix: Padding(
padding: const EdgeInsets.only(right: 16.0),
child: Icon(
Icons.bug_report,
size: 24,
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
suffix: FilledButton.icon(
onPressed: () async {
await Clipboard.setData(
ClipboardData(
text: loggerMemory.buffer
.map((e) => e.lines.join('\n'))
.join('\n\n'),
),
);
if (context.mounted) {
showInfoMessage(context, 'Logs copied');
}
},
icon: const Icon(Icons.copy),
label: const Text('Copy'),
),
),
],
);
},
+9
View File
@@ -21,6 +21,15 @@ import 'package:weblibre/presentation/main_app.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError = (e) {
logger.e(e.toString(), error: e.exception, stackTrace: e.stack);
};
PlatformDispatcher.instance.onError = (error, stack) {
logger.e('Unhandled Error', error: error, stackTrace: stack);
return true;
};
if (kDebugMode) {
final serviceProtocolInfo = await Service.getInfo();
logger.d('VM: ${serviceProtocolInfo.serverUri}');
+6
View File
@@ -15,6 +15,12 @@ void showErrorMessage(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
void showInfoMessage(BuildContext context, String message) {
final snackBar = SnackBar(content: Text(message));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
void showTabBackButtonMessage(
BuildContext context,
int tabCount,