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

问题描述

最近我开始着手一个项目,该项目基本上具有以下结构:

enter image description here

如您所见,现在我们仅支持在表示层上进行日志记录,其中我们有 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 和我在应用程序中使用的实际记录器,并且是通过 worker 的构造函数注入的依赖关系

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

属于 Microsoft.Extensions.Logging.ILogger

类型

解决方法

Microsoft.Extensions.Logging.ILogger

您将在数据层业务层中保持非常标准,不依赖于 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,而 Microsoft.Extensions.Logging 依赖于 StripeElement--complete。因此,无需为 StripeElement--empty 添加额外的 Nuget 包。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...