我在WPF + Prism中使用NLog,但是我想在每个模块(类)中使用Microsoft.Extensions.Logging.ILogger,该如何实现。
我开始制作一个示例程序,因为我希望能够使用WPF + Prism制作一个应用程序。
因为Prism官方已经将Prism.Logging从Prism框架中删除,目前选择的日志框架是NLog,通过使用Microsoft.Extensions.Logging.ILogger可以实现。虽然这可能还不是最好的用法,但是在大多数情况下,只要您知道日志级别(INFO / DEBUG / ERROR)就足够了。
对于要使用日志输出的函数,我将ILogger传递给该类的构造函数,并让Prism解决该问题。这就是它的用法。
//指定ILogger构造函数的参数,它获得注入Prism
public MainWindowViewModel(ILogger logger)
{
logger.LogInformation("DI logger in MainWindowViewModel.cs");
}
当然,您需要为Prism的DI容器注册ILogger的实现类。使用logger,您只需要一个实现类的实例,因此
containerRegistry.RegisterInstance(logger);
您作为参数传递的记录器,必须从Microsoft.Extensions.Logging.ILogger继承。如何从NLog制作Microsoft.Extensionis.Logging.ILogger?
在NLog Getting Started中,
无论如何,使用Prism的DI容器很难知道该怎么做。
因为UseNLog()和AddNLog()是NLog→(Microsoft)ILogger,所以我认为应该有这样的功能,当我再次查看.NET Core控制台示例时using NLog.Extensions.Logging;
,我注意到它已经完成了。似乎有一个函数可以执行NLog→(Microsoft)ILogger。
如果您要求不高,您会发现可以使用如下代码:从NLog到(Microsoft)ILogger的转换using NLog.Extensions.Logging;
。
*使用NuGet获取NLog.Extensions.Logging
App.xaml.cs
using LoggerSample.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;
using Microsoft.Extensions.Logging;
namespace LoggerSample
{
public partial class App
{
//略
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
#if false
//从该组NLog.Config的程序代码中的变化
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "log/file.txt" };
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile);
NLog.LogManager.Configuration = config;
#endif
var factory = new NLog.Extensions.Logging.NLogLoggerFactory();
Microsoft.Extensions.Logging.ILogger logger = factory.CreateLogger("");
containerRegistry.RegisterInstance(logger);
// 从集合Container中获取ILogger对象
var log = Container.Resolve();
log.LogInformation("日志测试");
}
}
}
在ViewModel中调用ILogger方法
public NavigateMeumViewModel(IRegionManager regionManager, IDialogService dialogService, ILogger logger)
{
_regionManager = regionManager;
_dialogService = dialogService;
NavigateCommand = new DelegateCommand(Navigate);
logger.LogInformation("NavigateMeumViewModel-1");
logger.LogError("NavigateMeumViewModel-2");
logger.LogTrace("NavigateMeumViewModel-3");
logger.LogDebug("NavigateMeumViewModel-4");
logger.LogCritical("NavigateMeumViewModel-5");
ShowDialog();
}
结果如下 nlog.txt文件日志
2021-02-05 21:57:34.6365|Info|72|FileSystemWatcherAPP.Bootstrapper|日志测试|
2021-02-05 23:00:25.6497|Info|72|FileSystemWatcherAPP.Bootstrapper|日志测试|
2021-02-05 23:00:26.7846|Info|34|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel|
2021-02-05 23:02:22.3837|Info|72|FileSystemWatcherAPP.Bootstrapper|Test in RegsiterTypes()|
2021-02-05 23:02:23.1976|Info|34|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel-1|
2021-02-05 23:02:23.2195|Error|35|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel-2|
2021-02-05 23:02:23.2195|Trace|36|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel-3|
2021-02-05 23:02:23.2195|Debug|37|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel-4|
2021-02-05 23:02:23.2275|Fatal|38|FileSystemWatcherAPP.ViewModel.NavigateMeumViewModel|NavigateMeumViewModel-5|
*首先添加negut包Nlog.Config
*创建NLog.config并将其复制到输出目录:
参考链接
Nlog.Config:日志方法步骤