WPF+ Prism+ NLog

 

前言

我在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中,

  • .NET Framework→直接使用NLog而不使用DI的示例
  • .ASP.NET Core→WebHost的UseNLog()示例
  • .NET Core控制台→Microsoft的DI容器(ServiceCollection)的AddNLog()示例

无论如何,使用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:日志方法步骤

你可能感兴趣的:(WPF,Prism,Logging,WPF)