using System.Runtime.CompilerServices; using NLog; namespace PMSWPF.Helper; /// /// NLog 日志帮助类,提供简化的日志记录方法,并自动捕获调用者信息。 /// public static class NlogHelper { /// /// 获取当前类的 NLog 日志实例。 /// private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); /// /// 记录一个错误级别的日志。 /// /// 日志消息内容。 /// 可选:要记录的异常对象。 /// 自动捕获:调用此方法的源文件完整路径。 /// 自动捕获:调用此方法的成员或属性名称。 /// 自动捕获:调用此方法的行号。 public static void Error(string msg, Exception exception = null, [CallerFilePath] string callerFilePath = "", [CallerMemberName] string callerMember = "", [CallerLineNumber] int callerLineNumber = 0) { // 使用 using 语句确保 MappedDiagnosticsLogicalContext 在作用域结束时被清理。 // 这对于异步方法尤其重要,因为上下文会随着异步操作的流转而传递。 using (MappedDiagnosticsLogicalContext.SetScoped("CallerFilePath", callerFilePath)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerLineNumber", callerLineNumber)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerMember", callerMember)) { Logger.Error(exception, msg); } } /// /// 记录一个信息级别的日志。 /// /// 日志消息内容。 /// 自动捕获:调用此方法的源文件完整路径。 /// 自动捕获:调用此方法的成员或属性名称。 /// 自动捕获:调用此方法的行号。 public static void Info(string msg, [CallerFilePath] string callerFilePath = "", [CallerMemberName] string callerMember = "", [CallerLineNumber] int callerLineNumber = 0) { using (MappedDiagnosticsLogicalContext.SetScoped("CallerFilePath", callerFilePath)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerLineNumber", callerLineNumber)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerMember", callerMember)) { Logger.Info(msg); } } /// /// 记录一个警告级别的日志。 /// /// 日志消息内容。 /// 自动捕获:调用此方法的源文件完整路径。 /// 自动捕获:调用此方法的成员或属性名称。 /// 自动捕获:调用此方法的行号。 public static void Warn(string msg, [CallerFilePath] string callerFilePath = "", [CallerMemberName] string callerMember = "", [CallerLineNumber] int callerLineNumber = 0) { using (MappedDiagnosticsLogicalContext.SetScoped("CallerFilePath", callerFilePath)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerLineNumber", callerLineNumber)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerMember", callerMember)) { Logger.Warn(msg); } } /// /// 记录一个跟踪级别的日志。 /// /// 日志消息内容。 /// 自动捕获:调用此方法的源文件完整路径。 /// 自动捕获:调用此方法的成员或属性名称。 /// 自动捕获:调用此方法的行号。 public static void Trace(string msg, [CallerFilePath] string callerFilePath = "", [CallerMemberName] string callerMember = "", [CallerLineNumber] int callerLineNumber = 0) { using (MappedDiagnosticsLogicalContext.SetScoped("CallerFilePath", callerFilePath)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerLineNumber", callerLineNumber)) using (MappedDiagnosticsLogicalContext.SetScoped("CallerMember", callerMember)) { Logger.Trace(msg); } } }