using System.Text; namespace LanMountainDesktop.Launcher.Services; /// /// 简单的日志记录器 - 同时输出到控制台和文件 /// internal static class Logger { private static readonly object _lock = new(); private static string? _logFilePath; private static bool _initialized; /// /// 初始化日志记录器 /// public static void Initialize() { if (_initialized) { return; } try { var logDir = GetLogDirectory(); if (!string.IsNullOrEmpty(logDir)) { Directory.CreateDirectory(logDir); var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); _logFilePath = Path.Combine(logDir, $"launcher_{timestamp}.log"); Console.WriteLine($"[Logger] Log file initialized: {_logFilePath}"); } } catch (Exception ex) { Console.Error.WriteLine($"[Logger] Failed to initialize log file: {ex.Message}"); } _initialized = true; } /// /// 获取日志文件路径 /// public static string? GetLogFilePath() { return _logFilePath; } /// /// 获取日志目录 /// private static string? GetLogDirectory() { try { var appRoot = Commands.ResolveAppRoot(CommandContext.FromArgs([])); var resolver = new DataLocationResolver(appRoot); return resolver.ResolveLauncherLogsPath(); } catch { } try { var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); if (!string.IsNullOrEmpty(appData)) { return Path.Combine(appData, "LanMountainDesktop", "Launcher", "logs"); } } catch { } try { var launcherDir = AppContext.BaseDirectory; return Path.Combine(launcherDir, "Launcher", "logs"); } catch { } return null; } /// /// 记录信息日志 /// public static void Info(string message) { WriteLog("INFO", message); } /// /// 记录警告日志 /// public static void Warn(string message) { WriteLog("WARN", message); } /// /// 记录错误日志 /// public static void Error(string message) { WriteLog("ERROR", message); } /// /// 记录错误日志(带异常) /// public static void Error(string message, Exception exception) { WriteLog("ERROR", $"{message}\n{exception}"); } /// /// 写入日志 /// private static void WriteLog(string level, string message) { var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var logLine = $"[{timestamp}] [{level}] {message}"; Console.WriteLine(logLine); if (string.IsNullOrEmpty(_logFilePath)) { return; } try { lock (_lock) { File.AppendAllText(_logFilePath, logLine + Environment.NewLine, Encoding.UTF8); } } catch { } } }