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应用程序相同的日志记录提供程序和文件的正确方法。也许,我错过了任何著名的做法?
Microsoft.Extensions.Logging.ILogger我认为大多数日志库实现的通用接口并不尴尬。
在这种情况下使用单例会将您绑定到特定的日志记录库,这可能适合小型项目或 POC 项目,但想象一下跨团队共享您的库或发布它。期待一个接口就方便多了。
至于如何将您选择的日志库注入到您的类库中,您实际上不必担心它,因为它是由 DI 系统处理的。
您只需将您的类声明为 Web 项目类之一中的构造函数依赖项。
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |