using NLog; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Logger { public static class LoggerHelper { public static readonly ILogger Logger = LogManager.GetLogger("InfoLogger"); public static readonly ILogger sqlLogger = LogManager.GetLogger("SqlLogger"); // 日志事件,UI可以订阅 public static event Action? LogAdded; public static void InfoWithNotify(string message) { Logger.Info(message); // 写入 NLog NotifyUI(message, "lightblue"); // 触发UI显示 } public static void SuccessWithNotify(string message) { Logger.Info(message); NotifyUI(message, "lightgreen"); } public static void WarnWithNotify(string message, string stackTrace = null) { if (!string.IsNullOrEmpty(stackTrace)) { string location = GetProjectStackLine(stackTrace); message = $"{message} ({location})"; } Logger.Warn(message); NotifyUI(message, "orange"); } public static void ErrorWithNotify(string message, string stackTrace = null) { if (!string.IsNullOrEmpty(stackTrace)) { string location = GetProjectStackLine(stackTrace); message = $"{message} ({location})"; } Logger.Error(message); NotifyUI(message, "red"); } public static void InfoWithNotify(string message,int depth) { Logger.Info(message); // 写入 NLog NotifyUI(message, "lightblue"); // 触发UI显示 } public static void SuccessWithNotify(string message, int depth ) { Logger.Info(message); NotifyUI(message, "lightgreen"); } public static void WarnWithNotify(string message, int depth ) { Logger.Warn(message); NotifyUI(message, "orange"); } public static void ErrorWithNotify(string message, int depth ) { Logger.Error(message); NotifyUI(message, "red"); } private static void NotifyUI(string message, string color) { LogAdded?.Invoke(message,color); } // 解析堆栈,找到项目文件路径和行号 public static string GetProjectStackLine(string stackTrace) { if (string.IsNullOrEmpty(stackTrace)) return "未知位置"; var lines = stackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { // 匹配你项目的命名空间路径 if (line.Contains("BOB")) { // 提取 "in 文件路径:line 行号" var match = Regex.Match(line, @"in (.+?):line (\d+)"); if (match.Success) { return match.Value; // 返回类似 C:\...\MainViewModel.cs:line 37 } return line.Trim(); } } return lines[0].Trim(); // 如果找不到就返回第一条 } } }