假装我有两个项目。
第一个是 ASP.NET Core MVC项目,该项目依赖于NLog.Extensions.Logging
进行日志记录。这很棒;我可以在控制器上使用依赖项注入来获取ILogger
实例,并且nlog.config
文件包含我的NLog配置。
第二个是API依赖的类库,它直接依赖NLog
进行日志记录。它包含如下调用:
public class SampleClass
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public void DoStuff()
{
if (_failed) Logger.Error("oh no");
}
}
这些类通过一些反思性的向导实例化,我不能使用依赖注入来替换其记录器。您也可以将它们视为某种模型,无法在启动时实例化。
如何使我的库的日志显示在API的日志输出中?我希望它们会自动被nlog.config
捕获,但似乎不会被捕获。
答案 0 :(得分:4)
您不需要单独的配置文件。 如果您的ASP.net MVC核心项目具有nlog.config,并且在构建过程中成功复制,则在
时将加载相同的配置private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
确保正确复制了文件。还要在配置NLog.config中正确设置MinLevel。
确保您具有.NET Core ClassLibrary(只是为了确保它已成功加载)
在您的情况下,您也可以使用依赖注入,但这与Story不同。
这是使用NLog的完整示例
您需要获取NLog和NLog.Web.AspnetCore软件包
在Program.cs中
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
}).UseNLog()
.UseStartup<Startup>();
}
现在在ClassLibrary项目中,只需为NLog添加Referece。 注意:此处请确保ILogger来自Microsoft.Extensions.Logging,而不是来自NLog。
public class Class1
{
//private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private ILogger<Class1> _logger = null;
public Class1(ILogger<Class1> logger)
{
this._logger = logger;
}
public void DoStuff()
{
var _failed = true;
if (_failed) _logger.LogError("oh no");
}
}
现在它也可以正常工作了。
答案 1 :(得分:0)
类库绝不应依赖于特定的日志记录实现。相反,您应该使用称为 facade 的抽象。 Microsoft.Extensions.Logging
库是您可以使用的一种这样的外观,但是还有其他类似Common.Logging
的库。无论如何,需要利用日志记录的类都应与此抽象日志记录外观一起注入。例如:
public class SampleClass
{
private readonly ILogger _logger;
public SampleClass(ILogger<SampleClass> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public void DoStuff()
{
if (_failed) _logger.LogError("oh no");
}
}
然后,在您的Web应用程序或利用类库的任何其他具体应用程序中,实际上是在其中设置日志记录实现的位置,并通过DI容器对其进行注册,以将其注入到日志记录外观中。
总之,您的类库仅取决于您的日志记录外观,这使它可以一般调用诸如LogError
之类的东西。使用您的库的应用程序将设置其实际的具体日志记录实现,然后幕墙将在幕后将其用于库的日志记录。