0%

WPF MVVM框架—— Prism中配置NLog - just–like - 博客园

Excerpt

日志在生成环境中是必不可少的调试记录工具,在这里简单记录一下NLog在wpf中如何配置并如何注册到Prism的容器中 准备工作 需要安装三个NuGet程序包 Microsoft.Extensions.Logging.Abstraction NLog.Config NLog.Extensions.Lo


日志在生成环境中是必不可少的调试记录工具,在这里简单记录一下NLog在wpf中如何配置并如何注册到Prism的容器中

准备工作

需要安装三个NuGet程序包

Microsoft.Extensions.Logging.Abstraction

NLog.Config

NLog.Extensions.Logging

配置NLog

安装好之后在解决方案中会出现一个NLog.config,日志输出的路径,内容、规则等都在这个文件中进行配置,右击属性,将修改为始终复制。

若解决方案中没有出现NLog.config这个文件,则需要自己手动创建一个

关于配置,可以看NLog  github上的介绍  github: 配置文件 ·NLog/NLog Wiki ·GitHub

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<span>&lt;?</span><span>xml version="1.0" encoding="utf-8" </span><span>?&gt;</span>
<span>&lt;</span><span>nlog </span><span>xmlns</span><span>="http://www.nlog-project.org/schemas/NLog.xsd"</span><span>
xmlns:xsi</span><span>="http://www.w3.org/2001/XMLSchema-instance"</span><span>
autoReload</span><span>="true"</span><span>
internalLogLevel</span><span>="Info"</span><span>
internalLogFile</span><span>="c:\temp\internal-nlog-AspNetCore.txt"</span><span>&gt;</span>

<span>&lt;!--</span><span> enable asp.net core layout renderers </span><span>--&gt;</span>
<span>&lt;</span><span>extensions</span><span>&gt;</span>
<span>&lt;</span><span>add </span><span>assembly</span><span>="NLog.Web.AspNetCore"</span> <span>/&gt;</span>
<span>&lt;/</span><span>extensions</span><span>&gt;</span>

<span>&lt;!--</span><span> the targets to write to </span><span>--&gt;</span>
<span>&lt;</span><span>targets</span><span>&gt;</span>
<span>&lt;!--</span><span> File Target for all log messages with basic details </span><span>--&gt;</span>
<span>&lt;</span><span>target </span><span>xsi:type</span><span>="File"</span><span> name</span><span>="allfile"</span><span> fileName</span><span>="${basedir}/Logs/allfile/wpf-all-${shortdate}.log"</span><span>
layout</span><span>="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}"</span> <span>/&gt;</span>

<span>&lt;!--</span><span> File Target for own log messages with extra web details using some ASP.NET core renderers </span><span>--&gt;</span>
<span>&lt;</span><span>target </span><span>xsi:type</span><span>="File"</span><span> name</span><span>="ownFile-web"</span><span> fileName</span><span>="${basedir}/Logs/ownFile/wpf-own-${shortdate}.log"</span><span>
layout</span><span>="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}"</span> <span>/&gt;</span>

<span>&lt;!--</span><span>Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection </span><span>--&gt;</span>
<span>&lt;</span><span>target </span><span>xsi:type</span><span>="Console"</span><span> name</span><span>="lifetimeConsole"</span><span> layout</span><span>="${MicrosoftConsoleLayout}"</span> <span>/&gt;</span>
<span>&lt;/</span><span>targets</span><span>&gt;</span>

<span>&lt;!--</span><span> rules to map from logger name to target </span><span>--&gt;</span>
<span>&lt;</span><span>rules</span><span>&gt;</span>
<span>&lt;!--</span><span>All logs, including from Microsoft</span><span>--&gt;</span>
<span>&lt;</span><span>logger </span><span>name</span><span>="*"</span><span> minlevel</span><span>="Trace"</span><span> writeTo</span><span>="allfile"</span> <span>/&gt;</span>

<span>&lt;!--</span><span>Output hosting lifetime messages to console target for faster startup detection </span><span>--&gt;</span>
<span>&lt;</span><span>logger </span><span>name</span><span>="Microsoft.Hosting.Lifetime"</span><span> minlevel</span><span>="Info"</span><span> writeTo</span><span>="lifetimeConsole, ownFile-web"</span><span> final</span><span>="true"</span> <span>/&gt;</span>

<span>&lt;!--</span><span>Skip non-critical Microsoft logs and so log only own logs (BlackHole) </span><span>--&gt;</span>
<span>&lt;</span><span>logger </span><span>name</span><span>="Microsoft.*"</span><span> maxlevel</span><span>="Info"</span><span> final</span><span>="true"</span> <span>/&gt;</span>
<span>&lt;</span><span>logger </span><span>name</span><span>="System.Net.Http.*"</span><span> maxlevel</span><span>="Info"</span><span> final</span><span>="true"</span> <span>/&gt;</span>

<span>&lt;</span><span>logger </span><span>name</span><span>="*"</span><span> minlevel</span><span>="Trace"</span><span> writeTo</span><span>="ownFile-web"</span> <span>/&gt;</span>
<span>&lt;/</span><span>rules</span><span>&gt;</span>
<span>&lt;/</span><span>nlog</span><span>&gt;</span>

复制代码

创建实例并注册到IOC容器中

打开App.xaml.cs

复制代码

1
2
3
4
5
6
7
<span>private</span><span> ILogger _logger;
</span><span>protected</span> <span>override</span> <span>void</span><span> RegisterTypes(IContainerRegistry containerRegistry)
{
</span><span>var</span> factory = <span>new</span><span> NLogLoggerFactory();
_logger </span>= factory.CreateLogger(<span>"</span><span>NLog.config</span><span>"</span><span>);
containerRegistry.RegisterInstance</span>&lt;ILogger&gt;<span>(_logger);
}</span>

复制代码

这里要注册为单例类型,整个App使用的是同一个实例

获取及使用

日志实例通过构造函数注入获取,

1
2
3
4
<span>public</span><span> MainViewModel(ILogger logger)
{
</span><span>this</span>._logger =<span> logger;
}</span>

使用

1
_logger.LogInformation($<span>"</span><span>测试日志</span><span>"</span>);

注意;

在编写程序的过程中,很难保证程序不会因为异常而退出,这时就需要将异常信息打印出来,方便查找问题的所在,所以需要在App.xaml.cs 中的CreateShell方法中订阅一些异常事件,并将这些异常信息打印到日志中

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<span>protected</span> <span>override</span><span> Window CreateShell()
{
</span><span>//</span><span>ui线程未捕获的异常</span>
DispatcherUnhandledException +=<span> OnDispatcherUnhandledException;
</span><span>//</span><span>Task线程未捕获的异常</span>
TaskScheduler.UnobservedTaskException +=<span> OnUnobservedTaskException;
</span><span>//</span><span>多线程异常</span>
AppDomain.CurrentDomain.UnhandledException +=<span> OnUnhandledException;
</span><span>return</span> Container.Resolve&lt;MainView&gt;<span>();
}

</span><span>private</span> <span>void</span> OnDispatcherUnhandledException(<span>object</span><span> sender, DispatcherUnhandledExceptionEventArgs e)
{
_logger.LogCritical($</span><span>"</span><span>{e.Exception.StackTrace},{e.Exception.Message}</span><span>"</span><span>);
}

</span><span>private</span> <span>void</span> OnUnobservedTaskException(<span>object</span>?<span> sender, UnobservedTaskExceptionEventArgs e)
{
_logger.LogCritical($</span><span>"</span><span>{e.Exception.StackTrace},{e.Exception.Message}</span><span>"</span><span>);
}

</span><span>private</span> <span>void</span> OnUnhandledException(<span>object</span><span> sender, UnhandledExceptionEventArgs e)
{
Exception ex </span>= e.ExceptionObject <span>as</span><span> Exception;
_logger.LogCritical($</span><span>"</span><span>{ex.StackTrace},{ex.Message}</span><span>"</span><span>);
}</span>

复制代码

总结:

  1. 安装三个NuGet程序包
  2. 配置NLog.config
  3. 创建日志实例,并注册到IOC容器中
  4. 获取实例,打印日志