.NET Core单文件发布后日志频繁输出配置重载信息求助
.NET Core API单文件发布后Linux服务频繁输出配置重载日志问题
问题描述
将.NET Core API项目发布为DLL文件并通过Linux服务运行时,日志正常无重复信息;但改为单文件发布后,服务启动后日志频繁输出Config reload token fired. Checking for changes...。
原因分析
单文件发布时,.NET会将appsettings.json这类配置文件嵌入到单文件包中,默认的配置变更检测机制会持续尝试检测嵌入文件的变化,但嵌入文件无法被修改,导致检测逻辑不断触发,进而重复输出该日志。
解决方案
方案1:直接禁用配置变更检测
在构建WebApplication时,显式关闭配置文件的自动重载功能:
using NLog.Web; var builder = WebApplication.CreateBuilder(args); // 禁用配置文件的自动重载 builder.Configuration.AddJsonFile("appsettings.json", reloadOnChange: false); builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", reloadOnChange: false); // 原有服务注册逻辑 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Host.UseNLog(); var app = builder.Build(); // 中间件配置 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
方案2:根据发布模式动态调整
如果需要保留开发环境的配置重载能力,可通过判断是否为单文件发布来动态设置:
using NLog.Web; using System.Reflection; var builder = WebApplication.CreateBuilder(args); // 判断当前是否为单文件发布环境 var isSingleFile = !File.Exists(Assembly.GetEntryAssembly()!.Location); // 单文件模式下禁用配置重载,非单文件模式保持默认 builder.Configuration.AddJsonFile("appsettings.json", reloadOnChange: !isSingleFile); builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", reloadOnChange: !isSingleFile); // 原有服务注册逻辑 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Host.UseNLog(); var app = builder.Build(); // 中间件配置 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
方案3:通过NLog配置过滤日志
如果不想修改业务代码,可在NLog配置文件(如nlog.config)中调高配置相关日志的级别,避免频繁输出:
<rules> <!-- 过滤掉配置重载的Debug/Info级日志 --> <logger name="Microsoft.Extensions.Configuration" minlevel="Warn" writeTo="your-target-name" /> <!-- 其他日志规则保持不变 --> </rules>
方案4:发布时保留外部配置文件
若需要外部可修改的配置文件,发布时可通过参数指定不嵌入配置文件,这样配置变更检测会正常工作,不会频繁触发日志:
dotnet publish -c Release -r linux-x64 --self-contained true /p:PublishSingleFile=true /p:ExcludeFromSingleFile=appsettings.json;appsettings.*.json
内容的提问来源于stack exchange,提问作者Howard Hee
相关产品推荐
相关产品推荐

