BOB/Logger/LoggerHelper.cs

85 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string, string>? 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");
}
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(); // 如果找不到就返回第一条
}
}
}