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

控制台应用依赖注入中如何获取Serilog作为Microsoft Logger?(返回Null)

控制台应用中Serilog注入到自定义类的正确实现

问题根源分析

你遇到的ILogger返回null以及依赖注入失效的问题,主要来自三个错误:

  1. 非泛型ILogger未被DI容器注册,默认只注册泛型ILogger<T>或ILoggerFactory
  2. 手动实例化MyService绕过了DI容器,无法自动注入依赖
  3. 冗余的BuildServiceProvider()调用创建了未完全配置的独立容器,与最终Host的容器不一致

修正后的完整代码

Program.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MyProgram.Services;
using Serilog;

var hostBuilder = Host.CreateApplicationBuilder(args);

// 加载配置(无需手动Build,Host会自动处理)
hostBuilder.Configuration
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

// 配置并注入Serilog
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(hostBuilder.Configuration)
    .Enrich.FromLogContext()
    .CreateLogger();

hostBuilder.Logging.ClearProviders();
hostBuilder.Logging.AddSerilog(logger);

// 将自定义服务注册到DI容器
hostBuilder.Services.AddScoped<IMyService, MyService>();

// 构建Host
var host = hostBuilder.Build();

// 从DI容器获取服务(替代手动实例化)
var myService = host.Services.GetRequiredService<IMyService>();

// 调用服务方法
// myService.DoSomething();

// 保持控制台应用运行(按需使用)
await host.RunAsync();

MyService.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

public class MyService : IMyService
{
    private readonly IConfiguration _config;
    private readonly ILogger<MyService> _logger;

    // 注入泛型ILogger<T>,DI容器会自动注册该类型
    public MyService(IConfiguration config, ILogger<MyService> logger)
    {
        _config = config;
        _logger = logger;
    }

    public void DoSomething()
    {
        _logger.LogError("Exception occurred.");
    }
}

public interface IMyService
{
    void DoSomething();
}

关键修正点说明

  • 使用泛型日志器:替换非泛型ILogger为ILogger<MyService>,DI容器会自动为每个服务类型注册对应的泛型日志实例
  • 依赖注入容器管理服务:通过AddScoped/AddSingleton/AddTransient注册服务,再通过GetRequiredService从容器获取,确保依赖自动注入
  • 移除冗余代码:删除手动调用的BuildServiceProvider()和配置的Build(),让Host统一管理容器和配置生命周期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:03:12