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

.NET MAUI 7中使用Serilog遇ILogger依赖注入错误求助

解决.NET MAUI 7中Serilog无法注入Serilog.ILogger的问题

错误原因

你遇到的“无法解析Serilog.ILogger服务”问题,本质是当前配置仅将Serilog集成到了Microsoft.Extensions.Logging框架,但DI容器中并未直接注册Serilog.ILogger类型,而你的HomeViewModel构造函数依赖的是Serilog.ILogger,导致容器无法找到对应的实例。

解决方案

提供两种可行方案,根据你的需求选择:

方案一:改用.NET通用日志接口(推荐)

符合.NET生态的通用日志规范,无需额外注册Serilog.ILogger,直接修改HomeViewModel的注入类型为Microsoft.Extensions.Logging.ILogger<T>:

// HomeViewModel.cs
using Microsoft.Extensions.Logging;

public class HomeViewModel
{
    private readonly ILogger<HomeViewModel> _logger;

    public HomeViewModel(ILogger<HomeViewModel> logger)
    {
        _logger = logger;
        // 使用示例:_logger.LogInformation("HomeViewModel初始化");
    }
}

你的MauiProgram.cs现有配置无需修改,保持如下即可:

using Serilog;
using System.IO;

var flushInterval = new TimeSpan(0, 0, 1);
// 建议使用MAUI的AppData目录避免权限问题
var file = Path.Combine(FileSystem.AppDataDirectory, "logClient-.log");

var logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
    .Enrich.FromLogContext()
    .WriteTo.File(file, flushToDiskInterval: flushInterval, encoding: System.Text.Encoding.UTF8, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 22)
    .CreateLogger();

builder.Services.AddLogging(lg => lg.AddSerilog(logger));

方案二:直接注册Serilog.ILogger到DI容器

如果必须在ViewModel中使用Serilog.ILogger,只需在MauiProgram.cs中添加一行注册代码,将已创建的logger实例注册为单例:

using Serilog;
using System.IO;

var flushInterval = new TimeSpan(0, 0, 1);
var file = Path.Combine(FileSystem.AppDataDirectory, "logClient-.log");

var logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
    .Enrich.FromLogContext()
    .WriteTo.File(file, flushToDiskInterval: flushInterval, encoding: System.Text.Encoding.UTF8, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 22)
    .CreateLogger();

// 先集成Serilog到日志框架
builder.Services.AddLogging(lg => lg.AddSerilog(logger));
// 注册Serilog.ILogger实例到DI容器
builder.Services.AddSingleton<Serilog.ILogger>(logger);

此时HomeViewModel中依赖Serilog.ILogger的构造函数就能正常解析:

// HomeViewModel.cs
using Serilog;

public class HomeViewModel
{
    private readonly ILogger _logger;

    public HomeViewModel(ILogger logger)
    {
        _logger = logger;
        // 使用示例:_logger.Information("HomeViewModel初始化");
    }
}

额外注意事项

  • 日志文件路径建议使用FileSystem.AppDataDirectory,避免在不同平台下出现文件写入权限问题;
  • 确保已安装必要的NuGet包:Serilog、Serilog.Sinks.File、Serilog.Extensions.Logging。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:50:07