C# 将NLog用于一个解决方案c上的多个项目#

C# 将NLog用于一个解决方案c上的多个项目#,c#,visual-studio,logging,nlog,C#,Visual Studio,Logging,Nlog,我在一个解决方案中有8个控制台项目(我计划将来将它们转换为服务),它们相互引用。我计划创建一个ILogger接口和Logger类来封装Nlog方法,因为我不想在每个项目中引用Nlog。并将此接口作为构建参数从核心项目传递给其他项目。差不多 using Core ... ILogger logger = new Logger(); 问题是: 1) 我可以为每个记录器使用一个配置吗?我用的是来自中国的想法。主要是调用方信息属性来获取程序集名称等,所以我不需要不同的日志文件或设置来确定日志的来源 2

我在一个解决方案中有8个控制台项目(我计划将来将它们转换为服务),它们相互引用。我计划创建一个ILogger接口和Logger类来封装Nlog方法,因为我不想在每个项目中引用Nlog。并将此接口作为构建参数从核心项目传递给其他项目。差不多

using Core
...
ILogger logger = new Logger();
问题是:

1) 我可以为每个记录器使用一个配置吗?我用的是来自中国的想法。主要是调用方信息属性来获取程序集名称等,所以我不需要不同的日志文件或设置来确定日志的来源

2) 我应该这样做,创建8个ILogger实例,而不是在Core assembly中的静态类上创建,并根据需要每次调用它的方法。我已经在其他程序集中引用了Core,所以不会再进行新的引用。我对8个iLogger的关注是并发写入一个文件/DB

1) 我可以为每个记录器使用一个配置吗?我使用这里的想法。主要是调用方信息属性来获取程序集名称等,所以我不需要不同的日志文件或设置来确定日志的来源

是的,配置应该在解决方案的启动项目中

2) 我应该这样做,创建8个ILogger实例,而不是在Core assembly中的静态类上创建,并根据需要每次调用它的方法。我已经在其他程序集中引用了Core,所以不会再进行新的引用

建议使用每个类的实例。您可以使用
LogManager.GetLogger(myClassName)
,否则很难跟踪日志的来源,也很难进行过滤

我对8个iLogger的关注是并发写入一个文件/DB


您可以将消息分组到缓冲目标中,以便对写入进行分组。请参阅

我使用Microsoft.Extensions.Logging在我的解决方案中使用了
,共有11个项目使用了依赖项注入。我通常在startup.cs文件中进行配置,并将nlog.config放在启动项目中。在其他项目中,例如repository项目,我使用如下方式:

public class ReceiptRepository : IReceiptRepository
{
    private readonly ReceiptContext _context;
   private readonly ILogger<ReceiptRepository> _logger;

    public ReceiptRepository(ReceiptContext context , ILogger<ReceiptRepository> logger)
    {
        _context = context;
        _logger = logger;
    }

    public async Task<ReceiptData> CreateReceiptAsync(ReceiptData receipt, CancellationToken token)
    {
       ...

       _logger.LogInformation($"ReceiptRepository::CreateReceiptAsync::{receipt.Id}:: is added to repository");

        return receipt;
    }
公共类ReceiptRepository:IReceiptRepository { 私有只读ReceiptContext\u上下文; 专用只读ILogger\u记录器; 公共ReceiptRepository(ReceiptContext上下文,ILogger记录器) { _上下文=上下文; _记录器=记录器; } 公共异步任务CreateReceiptAsync(ReceiptData接收,CancellationToken令牌) { ... _logger.LogInformation($“ReceiptRepository::CreateReceiptAsync::{receipt.Id}::已添加到存储库”); 回执; }