.NET 3.1 Azure Function 如何将Serilog日志输出到Azure Log Stream
解决方案
1. 调整Azure Functions基础日志配置
- 进入Azure门户对应Function App的「配置」→「监视」→「App Service日志」
- 开启「应用程序日志(文件系统)」,级别设置为
Information,保存后等待配置生效 - 查看Log Stream时,确认顶部筛选框选择的是「应用日志」而非仅「系统日志」
同时需要修改项目根目录的host.json配置,避免日志被Azure默认过滤规则拦截:
{ "version": "2.0", "logging": { "logLevel": { "Default": "Information", "Function": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } } }
2. 修正Serilog服务注册逻辑
你当前同时注册了SerilogLoggerProvider和调用了AddSerilog,属于重复注册,会导致日志输出冲突,直接删除AddSingleton<ILoggerProvider>那一行即可。
3. 添加适配Azure环境的Serilog Sink
本地调试用的控制台Sink在Azure Functions运行环境中不会被Log Stream直接捕获,需要安装专门的适配Sink:
- 先安装NuGet包
Serilog.Sinks.AzureAppServices - 修改Startup.cs中的Serilog初始化代码,添加适配Sink,示例如下:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .Enrich.FromLogContext() // 保留本地调试用的控制台输出 .WriteTo.Console() // 新增适配Azure Log Stream的Sink .WriteTo.AzureAppServices() // 保留原有文件输出配置 .WriteTo.File( @"D:\home\LogFiles\Application\myapp.txt", fileSizeLimitBytes: 1_000_000, rollOnFileSizeLimit: true, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(1)) .CreateLogger(); // 移除原来的AddSingleton<ILoggerProvider>注册,只保留AddSerilog即可 builder.Services.AddLogging(lb => lb.AddSerilog(Log.Logger, dispose: true));
4. 额外注意事项
- 如果使用
Serilog.Log静态类输出日志,确保Function执行过程中没有其他代码覆盖Log.Logger的赋值 - 若部署到Linux消费计划的Function App,文件路径需要修改为
/home/LogFiles/Application/myapp.txt,Windows计划可以保留原有路径
内容的提问来源于stack exchange,提问作者chiaDev
相关产品推荐
相关产品推荐

