【问题标题】:Using NLog for several projects on one solution c#在一个解决方案 c# 上将 NLog 用于多个项目
【发布时间】:2017-08-08 10:52:20
【问题描述】:

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

using Core
...
ILogger logger = new Logger();

问题是:

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

2) 我应该这样创建 8 个 ILogger 实例,而不是在核心程序集中创建静态类并在每次需要时调用它的方法。我已经在所有其他程序集中引用了 Core,因此不会再进行新的引用。我对 8 个 ILogger 的担忧是并发写入一个文件/数据库。

【问题讨论】:

标签: c# visual-studio logging nlog


【解决方案1】:

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

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

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

推荐每个类的实例。可以使用LogManager.GetLogger(myClassName),否则很难追踪到日志的来源,也很难过滤。

我对 8 个 ILogger 的担忧是并发写入一个文件/数据库。

您可以将消息分组到缓冲目标中,以便对写入进行分组。见the docs of the Buffering Wrapper target

【讨论】:

    【解决方案2】:

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

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多