如何在开发环境下通过NLog控制台目标记录异常/错误后暂停控制台?
实现方案
完全可以实现这个需求,以下是两种实用的方案,均确保仅在开发环境+控制台日志启用的场景下生效:
方案一:自定义NLog控制台目标
通过继承NLog的ConsoleTarget,重写日志写入逻辑,在Error/Fatal级别日志输出后暂停控制台。
1. 编写自定义目标类
using NLog; using NLog.Targets; using System; [Target("PauseOnErrorConsole")] public class PauseOnErrorConsoleTarget : ConsoleTarget { protected override void Write(LogEventInfo logEvent) { // 先执行默认的控制台日志输出 base.Write(logEvent); // 判断是否为开发环境(可根据你的环境配置调整判断逻辑) bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")? .Equals("Development", StringComparison.OrdinalIgnoreCase) ?? false; // 桌面应用可改用编译符号判断: // #if DEBUG // bool isDevelopment = true; // #else // bool isDevelopment = false; // #endif // 仅在开发环境且日志级别为Error/Fatal时暂停 if (isDevelopment && logEvent.Level >= LogLevel.Error) { Console.WriteLine("\n按任意键继续..."); Console.ReadKey(intercept: true); } } }
2. 配置NLog.config
注册自定义目标,并通过环境变量控制控制台日志的启用:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 注册自定义目标所在的程序集 --> <extensions> <add assembly="你的项目程序集名称" /> </extensions> <targets> <!-- 开发环境用自定义控制台目标,生产环境可保留普通文件/数据库目标 --> <target xsi:type="PauseOnErrorConsole" name="console" /> <target xsi:type="File" name="file" fileName="logs/${shortdate}.log" /> </targets> <rules> <!-- 仅开发环境启用控制台日志 --> <logger name="*" minlevel="Trace" writeTo="console" enabled="${environment:ASPNETCORE_ENVIRONMENT:equals=Development}" /> <!-- 生产环境启用文件日志 --> <logger name="*" minlevel="Info" writeTo="file" enabled="${environment:ASPNETCORE_ENVIRONMENT:equals=Production}" /> </rules> </nlog>
方案二:订阅NLog全局日志事件
通过订阅NLog的全局日志事件,在符合条件时触发控制台暂停,无需修改目标类。
代码示例
using NLog; using System; using System.Linq; class Program { static void Main(string[] args) { var logger = LogManager.GetCurrentClassLogger(); // 检查是否启用了控制台日志且处于开发环境 bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")? .Equals("Development", StringComparison.OrdinalIgnoreCase) ?? false; bool hasConsoleTargetEnabled = LogManager.Configuration.LoggingRules .Any(r => r.Enabled && r.Targets.Any(t => t is ConsoleTarget)); if (isDevelopment && hasConsoleTargetEnabled) { LogManager.LogEvent += OnLogEvent; } // 测试代码 logger.Error("这是一条错误日志,控制台将暂停"); logger.Info("普通日志,不会触发暂停"); } private static void OnLogEvent(object sender, LogEventInfoEventArgs e) { // 仅在Error/Fatal级别日志时暂停 if (e.LogEvent.Level >= LogLevel.Error) { Console.WriteLine("\n按任意键继续..."); Console.ReadKey(intercept: true); } } }
注意事项
- 环境判断逻辑:根据你的项目类型调整(ASP.NET Core用
ASPNETCORE_ENVIRONMENT,桌面应用用DEBUG编译符号)。 - 避免非控制台场景阻塞:确保仅在控制台应用的开发环境中启用该逻辑,Windows服务等非控制台场景请勿使用。
- 规则联动:NLog规则中
enabled属性的判断要和代码环境判断保持一致,确保只有控制台日志启用时才触发暂停。
内容的提问来源于stack exchange,提问作者Bastien Vandamme
相关产品推荐
相关产品推荐

