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

