Refactor logger and minor code polish

This commit is contained in:
2025-03-16 00:54:27 +01:00
parent 4a92ba7340
commit 5f8ce8f7a1
3 changed files with 77 additions and 76 deletions

70
lib/logger.dart Normal file
View File

@@ -0,0 +1,70 @@
import 'dart:io';
// Logger class for writing logs to console and file
class Logger {
static final Logger _instance = Logger._internal();
static Logger get instance => _instance;
File? _logFile;
IOSink? _logSink;
Logger._internal() {
_initLogFile();
}
void _initLogFile() {
try {
// Use system temp directory
final tempDir = Directory.systemTemp;
final logFileName = 'rimworld_modman.log';
_logFile = File('${tempDir.path}${Platform.pathSeparator}$logFileName');
_logSink = _logFile!.openWrite(mode: FileMode.writeOnly);
info('Logging initialized. Log file: ${_logFile!.path}');
} catch (e) {
print('Failed to initialize log file: $e');
}
}
void _log(String message, String level) {
final timestamp = DateTime.now().toIso8601String();
final formattedMessage = '[$timestamp] [$level] $message';
// Always print to console
print(formattedMessage);
// Write to file if initialized
if (_logSink != null) {
try {
_logSink!.writeln(formattedMessage);
} catch (e) {
print('Error writing to log file: $e');
}
}
}
void info(String message) {
_log(message, 'INFO');
}
void warning(String message) {
_log(message, 'WARN');
}
void error(String message) {
_log(message, 'ERROR');
}
void close() {
if (_logSink != null) {
try {
_logSink!.flush();
_logSink!.close();
} catch (e) {
print('Error closing log file: $e');
}
_logSink = null;
}
}
}

View File

@@ -395,7 +395,7 @@ class _ModManagerPageState extends State<ModManagerPage> {
child: Icon( child: Icon(
Icons.home, Icons.home,
color: Colors.blue, color: Colors.blue,
size: 16, size: 24,
), ),
), ),
if (mod.isExpansion) if (mod.isExpansion)
@@ -404,7 +404,7 @@ class _ModManagerPageState extends State<ModManagerPage> {
child: Icon( child: Icon(
Icons.star, Icons.star,
color: Colors.yellow, color: Colors.yellow,
size: 16, size: 24,
), ),
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
@@ -415,7 +415,7 @@ class _ModManagerPageState extends State<ModManagerPage> {
child: const Icon( child: const Icon(
Icons.link, Icons.link,
color: Colors.orange, color: Colors.orange,
size: 16, size: 24,
), ),
), ),
if (mod.loadAfter.isNotEmpty) if (mod.loadAfter.isNotEmpty)
@@ -425,7 +425,7 @@ class _ModManagerPageState extends State<ModManagerPage> {
child: const Icon( child: const Icon(
Icons.arrow_downward, Icons.arrow_downward,
color: Colors.blue, color: Colors.blue,
size: 16, size: 24,
), ),
), ),
if (mod.loadBefore.isNotEmpty) if (mod.loadBefore.isNotEmpty)
@@ -435,7 +435,7 @@ class _ModManagerPageState extends State<ModManagerPage> {
child: const Icon( child: const Icon(
Icons.arrow_upward, Icons.arrow_upward,
color: Colors.green, color: Colors.green,
size: 16, size: 24,
), ),
), ),
], ],

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'dart:async'; import 'dart:async';
import 'package:rimworld_modman/logger.dart';
import 'package:xml/xml.dart'; import 'package:xml/xml.dart';
const root = r'C:/Users/Administrator/Seafile/Games-Rimworld'; const root = r'C:/Users/Administrator/Seafile/Games-Rimworld';
@@ -8,75 +9,6 @@ const configRoot = '$root/AppData/RimWorld by Ludeon Studios/Config';
const configPath = '$configRoot/ModsConfig.xml'; const configPath = '$configRoot/ModsConfig.xml';
const logsPath = '$root/ModManager'; const logsPath = '$root/ModManager';
// Logger class for writing logs to console and file
class Logger {
static final Logger _instance = Logger._internal();
static Logger get instance => _instance;
File? _logFile;
IOSink? _logSink;
Logger._internal() {
_initLogFile();
}
void _initLogFile() {
try {
// Use system temp directory
final tempDir = Directory.systemTemp;
final logFileName = 'rimworld_modman.log';
_logFile = File('${tempDir.path}${Platform.pathSeparator}$logFileName');
_logSink = _logFile!.openWrite(mode: FileMode.writeOnly);
info('Logging initialized. Log file: ${_logFile!.path}');
} catch (e) {
print('Failed to initialize log file: $e');
}
}
void _log(String message, String level) {
final timestamp = DateTime.now().toIso8601String();
final formattedMessage = '[$timestamp] [$level] $message';
// Always print to console
print(formattedMessage);
// Write to file if initialized
if (_logSink != null) {
try {
_logSink!.writeln(formattedMessage);
} catch (e) {
print('Error writing to log file: $e');
}
}
}
void info(String message) {
_log(message, 'INFO');
}
void warning(String message) {
_log(message, 'WARN');
}
void error(String message) {
_log(message, 'ERROR');
}
void close() {
if (_logSink != null) {
try {
_logSink!.flush();
_logSink!.close();
} catch (e) {
print('Error closing log file: $e');
}
_logSink = null;
}
}
}
XmlElement findCaseInsensitive(XmlElement element, String name) { XmlElement findCaseInsensitive(XmlElement element, String name) {
return element.childElements.firstWhere( return element.childElements.firstWhere(
(e) => e.name.local.toLowerCase() == name, (e) => e.name.local.toLowerCase() == name,
@@ -342,7 +274,6 @@ class ModList {
ModList({required this.path}); ModList({required this.path});
// Simplified loading with config file first
Future<void> loadWithConfig({bool skipFileCount = false}) async { Future<void> loadWithConfig({bool skipFileCount = false}) async {
final logger = Logger.instance; final logger = Logger.instance;
@@ -492,7 +423,7 @@ class ModList {
if (loadedModsCount % 50 == 0 || loadedModsCount == totalModsFound) { if (loadedModsCount % 50 == 0 || loadedModsCount == totalModsFound) {
logger.info( logger.info(
'Progress: Loaded $loadedModsCount mods (${stopwatch.elapsedMilliseconds}ms)', 'Progress: Loaded $loadedModsCount mods (${modTime}ms)',
); );
} }
} catch (e) { } catch (e) {