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
相关产品推荐
相关产品推荐

