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

时间:2018-11-18 17:57:33

标签: c# asp.net logging nlog class-library

我有一个使用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 ...
}   

这使我可以在需要时在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;
    }
}

但是现在我完全困惑于为类库设置日志记录。我可以想象的选项之一是使用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...);
    }
}

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我不认为它hbm2ddl.auto是大多数日志记录库实现的通用接口。

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

至于如何将您选择的日志记录库注入类库,您真的不必担心,因为DI系统会处理它。

您只需要在您的一个Web项目类中将您的类声明为构造函数依赖项即可。