- Replaced instances of the Logger package with a custom appLogger for consistent logging. - Introduced app_logger.dart to manage logging with file output and storage permissions. - Updated all controllers (e.g., DashboardController, EmployeesScreenController, etc.) to use appLogger for logging messages. - Ensured that logging messages are appropriately categorized (info, warning, error) throughout the application. - Implemented a file logging mechanism to store logs in a designated directory. - Cleaned up old log files to maintain only the most recent logs.
80 lines
2.0 KiB
Dart
80 lines
2.0 KiB
Dart
import 'dart:io';
|
|
import 'package:logger/logger.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
class FileLogOutput extends LogOutput {
|
|
late final Directory _logDirectory;
|
|
late final String _todayLogFileName;
|
|
|
|
FileLogOutput() {
|
|
_init();
|
|
}
|
|
|
|
Future<void> _init() async {
|
|
_logDirectory = await getApplicationDocumentsDirectory();
|
|
final today = DateFormat('yyyy-MM-dd').format(DateTime.now());
|
|
_todayLogFileName = 'log_$today.txt';
|
|
await _cleanupOldLogs();
|
|
}
|
|
|
|
@override
|
|
void output(OutputEvent event) async {
|
|
final file = await _getTodayLogFile();
|
|
final logMessage = event.lines.join('\n') + '\n';
|
|
await file.writeAsString(logMessage, mode: FileMode.append, flush: true);
|
|
}
|
|
|
|
Future<File> _getTodayLogFile() async {
|
|
final path = '${_logDirectory.path}/$_todayLogFileName';
|
|
final file = File(path);
|
|
if (!await file.exists()) {
|
|
await file.create(recursive: true);
|
|
}
|
|
return file;
|
|
}
|
|
|
|
/// Keep only the most recent 3 days of logs
|
|
Future<void> _cleanupOldLogs() async {
|
|
final files = _logDirectory
|
|
.listSync()
|
|
.whereType<File>()
|
|
.where((f) => f.path.contains(RegExp(r'log_\d{4}-\d{2}-\d{2}\.txt')))
|
|
.toList();
|
|
|
|
files.sort((a, b) => b.path.compareTo(a.path));
|
|
|
|
if (files.length > 3) {
|
|
final oldFiles = files.sublist(3);
|
|
for (final f in oldFiles) {
|
|
try {
|
|
await f.delete();
|
|
} catch (e) {
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// For reading today's log
|
|
Future<String> readTodayLogs() async {
|
|
final file = await _getTodayLogFile();
|
|
return file.readAsString();
|
|
}
|
|
|
|
/// Read all log files (optional utility)
|
|
Future<Map<String, String>> readAllLogs() async {
|
|
final files = _logDirectory
|
|
.listSync()
|
|
.whereType<File>()
|
|
.where((f) => f.path.contains('log_'))
|
|
.toList();
|
|
|
|
Map<String, String> logs = {};
|
|
for (final f in files) {
|
|
logs[f.path.split('/').last] = await f.readAsString();
|
|
}
|
|
return logs;
|
|
}
|
|
}
|