我有一个使用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应用程序相同的日志记录提供程序和文件的正确方法。也许,我错过了任何著名的做法?
答案 0 :(得分:1)
我不认为它hbm2ddl.auto
是大多数日志记录库实现的通用接口。
在这种情况下使用单例将您绑定到特定的日志记录库,这可能适合小型项目或POC项目,但是请想象一下在团队之间共享您的库或发布它。期望一个接口要方便得多。
至于如何将您选择的日志记录库注入类库,您真的不必担心,因为DI系统会处理它。
您只需要在您的一个Web项目类中将您的类声明为构造函数依赖项即可。