记录来自.NET Standard类库的消息

Ale*_*ert 7 c# asp.net logging class-library nlog

我有一个ASP.NET Core(2.1.5)Web API项目的解决方案,该项目引用了几个.NET Standard 2.0类库项目。

我想对我的应用程序实现一些日志记录,并且我已经使用NLog为Web API项目完成了此操作(实际上,它可以是实现ILogger的任何提供程序)。为此,我在Program.cs中定义了一个静态字段,该字段在运行时初始化,并使用WebHostBuilderExtensions.ConfigureLogging对其进行了配置:

using Microsoft.Extensions.Logging;

public class Program
{
    private static readonly Logger logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
    // other content ...
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    var webHost = WebHost.CreateDefaultBuilder(args)
        .UseStartup(typeof(Startup).GetTypeInfo().Assembly.FullName)
        .ConfigureLogging(builder =>
        {
            builder.ClearProviders();
            builder.SetMinimumLevel(LogLevel.Information);
        })
        .UseNLog();
    // other content ...
}   
Run Code Online (Sandbox Code Playgroud)

这使我可以在需要时在ASP.NET Core应用程序内的每个类中使用ILogging的 DI :

using Microsoft.Extensions.Logging;

public class Startup
{
    public IConfiguration Configuration { get; }
    private readonly ILogger<Startup> _logger;

    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是现在我完全困惑于为类库设置日志记录。我可以想象的选项之一是使用DI机制来允许我的库调用相同的ILogger接口,如下所示:

using Microsoft.Extensions.Logging;

public class MyLibraryClass
{
    private ILogger<MyLibraryClass> _logger;

    public MyLibraryClass(ILogger<MyLibraryClass> logger)
    {
        _logger = logger;
    }

    public void SomeLibraryMethod()
    {
        _logger.LogInformation("Some library method logging here...);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这看起来很尴尬,因为我需要为需要记录日志的所有库类注入这种依赖(可以说是所有类)。

我还为每个库项目都考虑了一些静态类,该依赖项只注入了一次,以便该静态类可以充当ILogger的包装器。甚至将NLog从WebAPI项目移至其中一个库(甚至创建一个单独的库),并使用它从所有其他项目中调用此库。但是,正如这里所建议的那样,最好为每个类使用单独的ILogger实例来过滤不同的记录器。还是为某个项目创建静态记录器就足够了?

我的另一个担心是,围绕ILogger的此类静态包装程序将需要我定义自己的接口以使用日志消息。但是ILogger本身是一个经过精心设计的界面,这种态度似乎有些双重工作。

我浏览了许多分步指南,但是其中大多数描述了如何仅为一个ASP.NET Core Web应用程序配置日志记录(或者很可能是我使用了错误的搜索关键字)。无论如何,我此刻陷入困境,不知道使我的库使用与主WebAPI应用程序相同的日志记录提供程序和文件的正确方法。也许,我错过了任何著名的做法?

are*_*ler 3

Microsoft.Extensions.Logging.ILogger我认为大多数日志库实现的通用接口并不尴尬。

在这种情况下使用单例会将您绑定到特定的日志记录库,这可能适合小型项目或 POC 项目,但想象一下跨团队共享您的库或发布它。期待一个接口就方便多了。

至于如何将您选择的日志库注入到您的类库中,您实际上不必担心它,因为它是由 DI 系统处理的。

您只需将您的类声明为 Web 项目类之一中的构造函数依赖项。