【发布时间】: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