.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
相关产品推荐
相关产品推荐

