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

ASP.NET Core 6 MVC中NLog无法写入日志到Azure Blob Storage排查求助

排查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:24:59