You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在开发环境下通过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);
        }
    }
}

注意事项

  1. 环境判断逻辑:根据你的项目类型调整(ASP.NET Core用ASPNETCORE_ENVIRONMENT,桌面应用用DEBUG编译符号)。
  2. 避免非控制台场景阻塞:确保仅在控制台应用的开发环境中启用该逻辑,Windows服务等非控制台场景请勿使用。
  3. 规则联动:NLog规则中enabled属性的判断要和代码环境判断保持一致,确保只有控制台日志启用时才触发暂停。

内容的提问来源于stack exchange,提问作者Bastien Vandamme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:13:11