【问题标题】:Log messages from .NET Standard class library来自 .NET Standard 类库的日志消息
【发布时间】:2019-04-21 04:17:12
【问题描述】:

我有一个 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 应用程序相同的日志记录提供程序和文件的正确方法。也许,我错过了一些众所周知的做法?

【问题讨论】:

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


    【解决方案1】:

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

    在这种情况下使用单例会将您绑定到特定的日志库,这对于小型项目或 POC 项目来说可能很好,但想象一下跨团队共享您的库或发布它。期待一个界面要方便得多。

    至于如何将你选择的日志库注入到你的类库中,你不必担心,因为它由 DI 系统负责。

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

    【讨论】:

      【解决方案2】:

      我认为您的 Library 项目类应该在其 CTOR 中注入 Microsoft.Extensions.Logging.ILogger 喜欢ILogger&lt;T&gt; logger = null。 使用它的项目负责配置 Logging 提供程序,就像 DotNet Core 应用程序中的 ASP.NET 通用主机完成 OOTB 一样。如果有人忘记这样做,它不会抛出错误(DI 解析错误),因为默认值为 null。

      一定要像 logger?.LogDebug() 一样使用它并进行空检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2012-02-08
        • 2022-07-04
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        相关资源
        最近更新 更多