.NET 6 Azure Function DI注册ILogger跨项目日志生效方案
.NET 6 Azure Function 构造函数注入日志缺失问题修复
问题根因
- 重复注册日志服务覆盖了Azure Functions默认日志管道:你在
Startup中手动调用AddLogging()、AddApplicationInsightsTelemetryWorkerService(),会清空Functions运行时预配置的、和Monitor面板/执行上下文绑定的日志提供程序,导致构造函数注入的ILogger没有接入原生日志链路,自定义类输出的日志无法被Monitor捕获。 - 日志注入方式混用导致依赖不一致:Run方法参数传入的
ILogger是单次触发器执行时动态生成的、绑定请求上下文的实例,和DI容器默认解析的泛型ILogger<T>不是同一条链路,会导致关联类库项目解析日志服务时出现空引用。 host.json缺少自定义命名空间的日志级别配置,存在业务日志被默认过滤规则拦截的可能。
修复步骤
- 清理Startup中多余的日志注册代码
进程内模型的Azure Functions已经内置了日志、Application Insights集成能力,不需要手动注册日志相关服务,只需要注册自己的业务服务即可:
public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 仅注册业务服务,删除AddLogging、AddApplicationInsightsTelemetryWorkerService调用 builder.Services.AddScoped<ITestMessageUseCase, TestMessageUseCase>(); } }
- 补全host.json日志过滤规则
显式配置业务项目命名空间的日志输出级别,避免自定义类日志被过滤:
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } }, "logLevel": { "default": "Information", // 替换为Function项目根命名空间 "YourFunctionAppRootNamespace": "Information", // 替换为关联解决方案项目根命名空间 "YourLinkedProjectRootNamespace": "Information" } } }
- 统一日志注入方式
全项目统一使用构造函数注入ILogger<T>的方式获取日志实例,不要在Run方法参数中传入ILogger,确保所有位置解析的日志实例都来自同一个DI容器,自动接入Functions原生日志管道。
修正后的Function类示例:
public class HttpTestMessageAdaptor { private readonly ILogger<HttpTestMessageAdaptor> _log; private readonly ITestMessageUseCase _testMessageUseCase; public HttpTestMessageAdaptor(ILogger<HttpTestMessageAdaptor> logger, ITestMessageUseCase messageUseCase) { _log = logger; _testMessageUseCase = messageUseCase; } [FunctionName("HttpTestMessageAdaptor")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req) { try { string name = req.Query["name"]; var responseMessage = _testMessageUseCase.Process(name); _log.LogInformation($"AzureFunction: [Http-Trigger] [HttpTestMessageAdaptor] [{responseMessage}] Executed At {DateTime.Now}"); return new OkObjectResult(responseMessage); } catch (Exception ex) { _log.LogError(ex, $"Error: AzureFunction [Http-Trigger] [HttpTestMessageAdaptor] Executed At {DateTime.UtcNow}"); throw; } } }
关联类库项目保持现有构造函数注入ILogger<T>的写法即可,不需要额外修改。
注意:如果需要对接Application Insights,直接在Function配置中添加Application Insights连接字符串即可,不需要额外安装Worker服务版本的NuGet包,避免和运行时内置组件版本冲突。
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

