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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:45:37