add proper logging

This commit is contained in:
shenlong-tanwen
2024-08-21 23:43:48 +05:30
parent 1631df70e9
commit 75448ce56b
37 changed files with 923 additions and 224 deletions
@@ -36,11 +36,16 @@ class Assets {
}
class AssetGenImage {
const AssetGenImage(this._assetName, {this.size = null});
const AssetGenImage(
this._assetName, {
this.size,
this.flavors = const {},
});
final String _assetName;
final Size? size;
final Set<String> flavors;
Image image({
Key? key,
@@ -1,4 +1,7 @@
import 'package:flutter/material.dart';
/// Log messages stored in the DB
const int kLogMessageLimit = 500;
/// Global ScaffoldMessengerKey to show snackbars
final GlobalKey<ScaffoldMessengerState> kScafMessengerKey = GlobalKey();
@@ -0,0 +1,29 @@
import 'package:dio/dio.dart';
import 'package:immich_mobile/presentation/router/router.dart';
import 'package:immich_mobile/service_locator.dart';
import 'package:immich_mobile/utils/mixins/log_context.mixin.dart';
class ImmichAuthInterceptor extends Interceptor with LogContext {
String? _accessToken;
void setAccessToken(String token) => _accessToken = token;
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
if (_accessToken != null) {
options.headers["x-immich-user-token"] = _accessToken;
}
handler.next(options);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
if (response.statusCode == 401) {
log.severe("Token expired. Logging user out");
di<AppRouter>().replaceAll([const LoginRoute()]);
return;
}
handler.next(response);
}
}
+75
View File
@@ -0,0 +1,75 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/interfaces/log.interface.dart';
import 'package:immich_mobile/domain/models/log.model.dart';
import 'package:immich_mobile/service_locator.dart';
import 'package:logging/logging.dart';
/// [LogManager] is a custom logger that is built on top of the [logging] package.
/// The logs are written to the database and onto console, using `debugPrint` method.
///
/// The logs are deleted when exceeding the `maxLogEntries` (default 500) property
/// in the class.
class LogManager {
LogManager._();
static final LogManager _instance = LogManager._();
// ignore: match-getter-setter-field-names
static LogManager get I => _instance;
List<LogMessage> _msgBuffer = [];
Timer? _timer;
late StreamSubscription<LogRecord> _subscription;
void _onLogRecord(LogRecord record) {
// Only print in development
assert(() {
debugPrint('[${record.level.name}] [${record.time}] ${record.message}');
if (record.error != null && record.stackTrace != null) {
debugPrint('${record.error}');
}
return true;
}());
final lm = LogMessage(
logger: record.loggerName,
content: record.message,
level: record.level.toLogLevel(),
createdAt: record.time,
error: record.error?.toString(),
stack: record.stackTrace?.toString(),
);
_msgBuffer.add(lm);
// delayed batch writing to database: increases performance when logging
// messages in quick succession and reduces NAND wear
_timer ??= Timer(const Duration(seconds: 5), _flushBufferToDatabase);
}
void _flushBufferToDatabase() {
_timer = null;
final buffer = _msgBuffer;
_msgBuffer = [];
di<ILogRepository>().addAll(buffer);
}
void init() {
_subscription = Logger.root.onRecord.listen(_onLogRecord);
}
void updateLevel(LogLevel level) {
Logger.root.level = Level.LEVELS.elementAtOrNull(level.index);
}
void dispose() {
_subscription.cancel();
}
void clearLogs() {
_timer?.cancel();
_timer = null;
_msgBuffer.clear();
di<ILogRepository>().clear();
}
}
@@ -4,5 +4,5 @@ import 'package:logging/logging.dart';
mixin LogContext {
@protected
@nonVirtual
Logger get log => Logger.detached(runtimeType.toString());
Logger get log => Logger(runtimeType.toString());
}