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

排查C#后台Windows服务‘调用目标引发异常’错误及NLog日志问题

问题分析与解决方案

一、"Exception has been thrown by the target of an invocation" 异常原因

该异常是反射调用时的包装异常,后台运行与调试的差异核心来自环境、权限和执行时机:

  • 权限差异:Windows服务默认以Local System或指定账户运行,和调试时的当前用户权限不同,可能导致数据库连接失败、日志目录无法写入、配置文件读取受限。
  • 初始化时机:服务由Windows服务控制管理器(SCM)启动,OnStart阶段的初始化代码可能在依赖资源(如数据库连接池、配置文件)未就绪时执行;调试时因启动速度慢或断点停留,资源已完成准备。
  • 工作目录问题:服务运行时默认工作目录为C:\Windows\System32,而非程序安装目录,导致NLog配置文件或应用配置无法正确加载。
  • 后台线程未捕获异常:定时任务在独立线程执行,若线程内抛出未捕获异常,会触发该包装异常;调试时IDE会直接捕获线程异常,不会暴露为目标调用异常。

二、NLog日志配置修复方案

1. 强制指定配置文件路径

服务运行时工作目录异常,需明确指向程序目录下的NLog配置:

// 在服务启动初期执行
var configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NLog.config");
if (File.Exists(configFilePath))
{
    LogManager.Configuration = new XmlLoggingConfiguration(configFilePath);
}

同时在NLog.config中使用绝对路径定义日志输出目录,避免依赖工作目录:

<targets>
  <target name="serviceLog" xsi:type="File"
          fileName="D:\YourServiceLogs\Service_${shortdate}.log"
          layout="${longdate} | ${level:uppercase=true} | ${message} | ${exception:format=ToString,StackTrace}" />
</targets>

2. 修正服务账户权限

  • 给服务运行账户授予日志输出目录的读写权限,确保能创建和写入日志文件。
  • 若服务需访问数据库,确认服务账户拥有数据库的连接、查询及操作权限,避免因权限不足在日志初始化前抛出异常。

3. 全局捕获未处理异常

在服务启动逻辑和定时任务中添加完整的异常捕获,确保所有异常都能被日志记录:

protected override void OnStart(string[] args)
{
    var logger = LogManager.GetCurrentClassLogger();
    try
    {
        logger.Info("服务启动中...");
        // 初始化定时任务、数据库连接等
        SetupScheduledTask();
    }
    catch (Exception ex)
    {
        logger.Fatal(ex, "服务启动失败");
        Stop(); // 终止服务避免异常循环
    }
}

private void ProcessQueueTask()
{
    var logger = LogManager.GetCurrentClassLogger();
    try
    {
        logger.Info("开始检查待处理队列");
        // 数据库查询与业务逻辑
        // ...
    }
    catch (Exception ex)
    {
        logger.Error(ex, "队列处理失败");
    }
}

4. 启用NLog内部日志排查配置问题

在NLog.config中开启内部日志,追踪NLog自身的加载或写入错误:

<nlog internalLogFile="D:\YourServiceLogs\NLog_Internal.log" internalLogLevel="Debug">
  <!-- 原有配置内容 -->
</nlog>

该日志会记录NLog加载配置、创建日志文件时的报错,比如路径不存在、权限不足等问题。

5. 确保配置文件随部署复制

在Visual Studio中,右键NLog.config文件,设置复制到输出目录为始终复制,保证部署时配置文件与程序文件在同一目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:43