在N层应用的业务层配置日志

Configure logging in the business layer of a N-layer application

最近我开始做一个基本上有以下结构的项目:

如您所见,现在我们只支持在表示层上记录日志,我们有 try/catch 块期望处理来自业务层的错误。到目前为止,一切都很好。但是,最近我开始意识到我还需要记录一些处理信息。不仅例外。如果可能,例如,在 Presentation App 1 存储其日志的同一文件中。

因此,为此目的,我想象的方式是我的业务层具有某种由 Serilog 和 log4net(可能还有其他提供程序)实现的通用接口,并使用它来进行日志记录。那是因为我真的不想在我的业务层项目中添加特定的日志记录包。换句话说,我希望它是独立的。所以,我试着看看一些最佳实践。我介绍了 this 文章,其中解释了 管理横切关注点 但我无法真正理解它如何适合我的情况。

如何使用在我的启动应用程序中依赖注入的记录器(在我的业务层项目中)?

更新: 我依赖于将我的记录器注入工作人员服务客户端的方式如下:

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(loggingBuilder =>
                {
                    var configuration = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json")
                        .Build();
                    var logger = new LoggerConfiguration()
                        .ReadFrom.Configuration(configuration)
                        .CreateLogger();
                    loggingBuilder.AddSerilog(logger, dispose: true);
                })

其中 loggingBuilder 的类型为 Microsoft.Extensions.Logging.ILoggingBuilder 并且我在应用程序中使用的实际记录器是通过依赖注入的工人的构造函数

public Worker(ILogger<Worker> logger, IBusinessLayerService businessLayerService)
        {
            _logger = logger;
            _businessLayerService = businessLayerService;
        }

类型为Microsoft.Extensions.Logging.ILogger

Microsoft.Extensions.Logging.ILogger

数据层 业务层 .[=18 中,您将保持非常标准,而不依赖于 Serilog 和 log4net =]

你像这样注入记录器

ILogger<YourBusinessClass>

本文介绍了如何将 Serilog 与默认记录器一起使用:

https://vmsdurano.com/serilog-and-asp-net-core-split-log-data-using-filterexpression/

Microsoft.Extensions.Logging 应该通过 Microsoft.AspNetCore.App 对您的应用程序可用,它依赖于 Microsoft.Extensions.Logging.Configuration,而 Microsoft.Extensions.Logging.Configuration 依赖于 Microsoft.Extensions.Logging。因此,无需为 Microsoft.Extensions.Logging.

添加额外的 Nuget 包