ASP.NET Core 6 MVC中NLog无法写入日志到Azure Blob Storage排查求助
针对你遇到的ASP.NET Core 6 MVC中NLog本地正常但无法写入Azure Blob的问题,按以下步骤排查:
1. 修正NLog配置加载方式
你的Program.cs中早期初始化NLog时使用了LoadConfigurationFromAppSettings(),但实际配置文件是NLog.config,这可能导致配置加载不完整。修改早期初始化代码,确保加载正确的配置文件:
// 替换原来的早期初始化代码 var logger = NLog.LogManager.Setup() .LoadConfigurationFromFile("NLog.config") .GetCurrentClassLogger();
或者直接移除早期初始化的配置加载,依赖builder.Host.UseNLog()自动加载NLog.config:
// 移除这一行:var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); var builder = WebApplication.CreateBuilder(args); // ...其他代码 builder.Host.UseNLog(); // 自动加载NLog.config
2. 统一连接字符串格式
NLog配置中的连接字符串包含分号后的空格(如; AccountName=...),虽然理论上不影响,但建议和你代码中正常工作的连接字符串保持完全一致(去掉空格):
connectionString="DefaultEndpointsProtocol=https;AccountName=mdxstorage1;AccountKey=a/g/KptWTDUpY76/dZQYBkqmVB+CgjlgRw4LM7kb1pxMIlZkvg32x/ifbMtFh9uY9wRUoX6DxQSu+AStK//VEg==;EndpointSuffix=core.windows.net"
3. 启用NLog Azure目标的即时刷新
NLog的AzureBlobStorage目标默认会缓冲日志,可能导致测试时看不到即时结果。在目标配置中添加immediateFlush="true"强制立即写入:
<target xsi:type="AzureBlobStorage" name="azure" connectionString="..." containerName="mdxweblogs" blobName="AzureLogging_${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" immediateFlush="true" />
4. 测试直接使用NLog.Logger而非Microsoft ILogger
排查是否是Microsoft日志集成的问题:在Controller中注入NLog原生Logger,而非Microsoft的ILogger,测试日志写入:
private readonly NLog.ILogger _nlogLogger; public StorageController() { _nlogLogger = NLog.LogManager.GetCurrentClassLogger(); } public IActionResult ListFiles() { _nlogLogger.Trace("Test NLog direct log to Azure Blob"); // ...其他代码 }
如果这条日志能写入Blob,说明问题出在Microsoft日志与NLog的集成规则上;如果还是不行,继续排查NLog本身的配置。
5. 检查NLog内部日志的细节
虽然你说没发现错误,但重点查找以下内容:
- 是否有
AzureBlobStorage target 'azure' is initialized的日志条目,确认目标已加载 - 是否有
Writing to blob 'AzureLogging_xxxx-xx-xx.log'的日志,确认NLog尝试写入 - 是否有任何与Azure存储相关的警告/错误(如权限、网络问题)
6. 升级NLog相关包版本
你的包版本存在不一致(NLog 5.2.5 vs NLog.Web.AspNetCore 5.3.5),建议升级到最新稳定版,确保兼容性:
<PackageReference Include="NLog" Version="5.3.11" /> <PackageReference Include="NLog.Web.AspNetCore" Version="5.3.11" /> <PackageReference Include="NLog.Extensions.AzureBlobStorage" Version="5.2.0" />
7. 验证NLog规则覆盖范围
确认你的日志规则logger name="AzureLogging.*"能覆盖所有需要写入的日志来源:
- 比如HomeController的日志名称是
AzureLogging.Controllers.HomeController,符合AzureLogging.*的匹配规则 - 可以临时添加一条匹配所有日志的规则测试:
<logger name="*" minlevel="Trace" writeTo="azure" />
如果这条规则能写入Blob,说明原规则的匹配范围有问题。
内容的提问来源于stack exchange,提问作者bedrock

