在一个解决方案上使用NLog进行多个项目c#

时间:2017-08-08 10:52:20

标签: c# visual-studio logging nlog

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

这样的东西
using Core
...
ILogger logger = new Logger();

问题是:

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

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

2 个答案:

答案 0 :(得分:0)

  

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

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

  

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

建议每班的实例。您可以使用LogManager.GetLogger(myClassName),否则日志所在的跟踪难以过滤。

  

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

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

答案 1 :(得分:0)

我在我的解决方案中使用了 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;
    }