ASP.NET MVC5+Unity依赖注入下Microsoft.Extensions.Logging无控制台日志问题
问题分析与解决方案
核心问题
你的代码存在三个关键问题导致日志无法输出:
- 未注册日志输出提供者:初始化
LoggerFactory时传入空的ILoggerProvider数组,没有配置任何日志输出渠道(比如控制台)。 - LoggingService实现冗余:每次调用
CreateLog都重复创建LoggerFactory,既浪费资源,也未配置有效输出逻辑。 - 依赖注入未配置日志服务:未将
ILogger、LoggerFactory等核心日志服务注册到Unity容器,无法实现日志服务的复用与注入。
解决步骤
1. 安装控制台日志提供者包
先通过NuGet安装控制台输出所需的包:
Install-Package Microsoft.Extensions.Logging.Console
2. 修改Global.asax.vb,正确配置并注册日志服务
Sub Application_Start() ' 初始化Unity容器 Dim container = New UnityContainer() ' 配置日志工厂,添加控制台输出支持 Dim loggerFactory = LoggerFactory.Create(Function(builder) builder.AddConsole() builder.SetMinimumLevel(LogLevel.Information) End Function) ' 将日志服务注册到Unity容器 container.RegisterInstance(Of ILoggerFactory)(loggerFactory) container.RegisterType(GetType(ILogger(Of )), GetType(Logger(Of ))) ' 注册自定义日志服务 container.RegisterType(Of ILoggingService, LoggingService)() ' 设置MVC的依赖解析器 DependencyResolver.SetResolver(New UnityDependencyResolver(container)) ' 测试全局日志输出 Dim logger = loggerFactory.CreateLogger(Of MvcApplication) logger.LogWarning("Logging Initialized at Global level.") End Sub
3. 重构LoggingService,通过依赖注入获取ILogger
去掉重复创建LoggerFactory的逻辑,改为构造函数注入日志实例:
Imports Microsoft.Extensions.Logging Public Class LoggingService Implements ILoggingService Private ReadOnly _logger As ILogger(Of LoggingService) ' 构造函数注入ILogger实例 Public Sub New(logger As ILogger(Of LoggingService)) _logger = logger End Sub Private Sub CreateLog(strLogText As String) Implements ILoggingService.CreateLog _logger.LogWarning(strLogText) End Sub End Class
4. 验证AccountController逻辑
你的AccountController已正确注入ILoggingService,无需修改。只要Unity容器配置正确,访问LogOn方法时就能正常输出日志。
效果验证
启动项目后,控制台会输出以下内容:
Logging Initialized at Global level.Logon controller has been called.
内容的提问来源于stack exchange,提问作者Ris
相关产品推荐
相关产品推荐

