feat: persistentes Auth-Log für Logout-Diagnose (M1)
Neuer AuthLog schreibt Login-Status-Wechsel und SDK-Warnungen/-Fehler
in eine Datei im App-Support-Verzeichnis, die einen Neustart übersteht.
Zusätzlich werden alle drei bewusst ausgelösten Logout-Buttons geloggt,
damit sich künftig unterscheiden lässt: Nutzer-Logout vs. vom SDK
automatisch ausgelöster Logout (Soft-Logout/M_UNKNOWN_TOKEN).
Reiner Logging-Zusatz, keine Verhaltensänderung – erster Schritt laut
ROADMAP M1 ("Erst Logging an allen Logout-Pfaden einbauen").
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
/// Schreibt Login-/Logout-relevante Ereignisse in eine Datei, die einen
|
||||
/// App-Neustart übersteht. Zweck: den Uta-Random-Logout-Bug nachvollziehen
|
||||
/// können, auch wenn die App zwischen dem Logout und dem nächsten Blick ins
|
||||
/// Log neu gestartet wurde (siehe ROADMAP M1).
|
||||
class AuthLog {
|
||||
static const _maxLines = 500;
|
||||
static File? _file;
|
||||
|
||||
static Future<File> _ensureFile() async {
|
||||
final existing = _file;
|
||||
if (existing != null) return existing;
|
||||
final dir = await getApplicationSupportDirectory();
|
||||
final file = File(p.join(dir.path, 'auth_log.txt'));
|
||||
return _file = file;
|
||||
}
|
||||
|
||||
static Future<void> write(String message) async {
|
||||
try {
|
||||
final file = await _ensureFile();
|
||||
await file.writeAsString(
|
||||
'${DateTime.now().toIso8601String()} $message\n',
|
||||
mode: FileMode.append,
|
||||
flush: true,
|
||||
);
|
||||
final lines = await file.readAsLines();
|
||||
if (lines.length > _maxLines) {
|
||||
await file.writeAsString(
|
||||
'${lines.sublist(lines.length - _maxLines).join('\n')}\n',
|
||||
);
|
||||
}
|
||||
} catch (_) {
|
||||
// Logging darf selbst nie einen Fehlerpfad (oder gar einen Logout) auslösen.
|
||||
}
|
||||
}
|
||||
|
||||
static Future<String> read() async {
|
||||
try {
|
||||
final file = await _ensureFile();
|
||||
if (!await file.exists()) return '(noch keine Einträge)';
|
||||
return await file.readAsString();
|
||||
} catch (e) {
|
||||
return 'Log konnte nicht gelesen werden: $e';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user