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

Azure Blob Storage未按配置生成每日日志文件,是否需调整门户配置?

Serilog写入Azure Blob Storage未生成每日日志文件的排查方案

问题背景

需在Azure存储账户中生成格式为service-yyyy-MM-dd.log的每日日志文件,已通过Serilog配置Azure Blob Storage写入,并实现了LogError记录方法,但未生成预期日志文件,需确认Azure门户是否需额外配置。

现有Serilog配置代码

builder.Host.UseSerilog((context, services, configuration) =>
{
    configuration.ReadFrom.Configuration(context.Configuration)
                .Enrich.FromLogContext()
                .WriteTo.AzureBlobStorage(
                    connectionString: context.Configuration["AzureBlobStorageConnectionString"],
                    storageContainerName: context.Configuration["AzureBlobStorageContainer"],
                    storageFileName: "service-{Date:yyyy-MM-dd}.log",
                    restrictedToMinimumLevel: LogEventLevel.Information);
});

日志记录方法

public static void LogError<T>(ILogger _logger, Exception ex,T model, string MethodName)
{
    StringBuilder sb = new();
    sb.AppendLine("Error with "+ MethodName+": " + ex.Message);
    sb.AppendLine("Request Body: " + JsonSerializer.Serialize(model));
    _logger.LogError(ex, sb.ToString());
}

必查Azure门户配置

以下是需要在Azure存储账户门户中确认的核心配置项:

  • 容器是否存在:Serilog的Azure Blob Sink默认不会自动创建容器,需手动在存储账户中创建与配置storageContainerName一致的容器。若不想手动创建,可在Serilog配置中添加createContainerIfNotExists: true参数自动创建。
  • 连接字符串权限:确保使用的存储账户连接字符串(或SAS令牌)拥有Blob容器的写入权限:
    • 若使用账户密钥:默认账户密钥具备全读写权限,需确认密钥未过期、未被轮换后更新配置。
    • 若使用SAS令牌:需包含Write、Add、Create权限,且令牌处于有效期内,同时资源范围覆盖目标容器。
  • 存储账户网络规则:若存储账户开启了防火墙或虚拟网络限制,需将应用部署环境(本地开发IP、Azure App Service实例所在虚拟网络等)添加到允许访问的列表中,否则日志写入请求会被拦截。
  • 容器访问层级:目标容器的访问层级设为私有即可(默认配置),无需改为公共,只要权限足够就能正常写入。

代码/依赖层面补充排查

除Azure门户配置外,还需确认以下内容:

  • NuGet包是否安装:确保已安装Serilog.Sinks.AzureBlobStorage包,这是Serilog写入Azure Blob的核心依赖。
  • 配置值是否正确:检查appsettings.json(或环境变量)中AzureBlobStorageConnectionString和AzureBlobStorageContainer的拼写、值是否正确,无多余空格或格式错误。
  • 日志级别是否匹配:配置中restrictedToMinimumLevel设为Information,而LogError属于Error级别(高于Information),级别规则没问题,但需确认无其他全局日志过滤规则拦截日志。
  • 启用调试日志验证:在Serilog配置中添加.WriteTo.Debug(),查看调试窗口是否能输出日志,确认日志本身是否正常生成(排除日志未产生的问题)。

优化后的Serilog配置示例

补充自动创建容器的参数,避免容器不存在导致的写入失败:

builder.Host.UseSerilog((context, services, configuration) =>
{
    configuration.ReadFrom.Configuration(context.Configuration)
                .Enrich.FromLogContext()
                .WriteTo.AzureBlobStorage(
                    connectionString: context.Configuration["AzureBlobStorageConnectionString"],
                    storageContainerName: context.Configuration["AzureBlobStorageContainer"],
                    storageFileName: "service-{Date:yyyy-MM-dd}.log",
                    restrictedToMinimumLevel: LogEventLevel.Information,
                    createContainerIfNotExists: true); // 自动创建容器
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:43:17