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

ASP.NET Core 3.0单文件发布时NLog配置异常解决方案咨询

解决ASP.NET Core 3.0单文件发布时NLog配置文件找不到的问题

这个问题的核心原因是:当启用PublishSingleFile+SelfContained模式发布时,.NET Core会将整个应用打包成单个可执行文件,运行时会自动将内容解压到系统临时目录(就是你错误日志里的C:\Windows\TEMP.net\MyAPI\...路径),但你的nlog.config是部署在站点根目录的,而NLog默认会从当前程序运行的临时目录查找配置文件,自然就找不到了。

下面是几个可行的解决步骤:

1. 获取应用的实际部署目录,指定NLog配置文件的绝对路径

你需要先找到应用exe所在的真实部署目录(而非临时解压目录),然后用这个路径来加载nlog.config。可以通过入口程序集的位置来获取:

using System.Reflection;
using System.IO;

// 获取当前应用程序集所在的真实部署目录
var exeDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
// 组合出nlog.config的绝对路径
var nlogConfigPath = Path.Combine(exeDirectory, "nlog.config");

2. 修改Program.cs中的NLog初始化代码

把原来直接用相对路径加载NLog的代码,替换成使用绝对路径的版本。修改后的Main方法如下:

public class Program
{
    public static void Main(string[] args)
    {
        // 先获取真实部署目录下的nlog.config路径
        var exeDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        var nlogConfigPath = Path.Combine(exeDirectory, "nlog.config");

        var logger = NLogBuilder.ConfigureNLog(nlogConfigPath).GetCurrentClassLogger();
        try
        {
            logger.Info("----------------------------");
            logger.Info("MyAPI Application Start");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            logger.Error(ex, "MyAPI stopped on Exception");
            throw;
        }
        finally
        {
            LogManager.Shutdown();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Warning);
            })
            .UseNLog()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

3. 确保配置文件被正确发布

在Visual Studio中,右键点击nlog.config和appsettings.json文件,选择属性,将复制到输出目录设置为始终复制(或如果较新则复制),这样发布时这些文件会被自动复制到站点根目录,和exe放在一起。

额外说明

如果你的NLog配置中引用了其他文件(比如自定义布局渲染器的程序集,或者日志输出的文件路径),也要注意使用绝对路径或者基于真实部署目录的相对路径,避免出现同样的路径问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:22:37