源码及PPT地址: https://github.com/JusterZhu/wemail

视频地址: https://www.bilibili.com/video/BV1KQ4y1C7tg?share \source=copy\web

本章分为以下几个部分来了解:

Part1 日志

Part1.1 全局异常捕捉

Part1.2 Dump

Part2 引入控件库

2.详细内容

Part1 日志

(1)Nuget安装:

Microsoft.Extensions.Logging.Abstractions

NLog.Extensions.Logging

NLog.Config

(2)配置Nlog.config

<?xml version="1.0" encoding="utf-8" ?>

< nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

autoReload = "true"

internalLogLevel = "info"

throwException = "true"

internalLogFile = "logs/internal-nlog.txt" > //日志的错误位置文件

< variable name = "logDirectory" value = "${basedir}/logs" />

<!-- the targets to write to -->

< targets async = "true" >

<!-- write logs to file -->

< target xsi:type = "File" name = "allfile" fileName = "${logDirectory}/nlog-all-${shortdate}.log"

layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

<!-- another file log, only own logs. Uses some ASP.NET core renderers -->

< target xsi:type = "File" name = "ownFile-web" fileName = "${logDirectory}/nlog-own-${shortdate}.log"

layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

<!--|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}-->

<!-- write log message to database -->

<!--<target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">-->

< target type = "Database" name = "db" dbProvider = "Npgsql.NpgsqlConnection,Npgsql" 《这里的数据库名字注意查找》connectionString = "Database=backofficev2;Host=*;User Id=*;Password=*;pooling=false;port=*;" >

< commandText > //使用postgresql 这里的字段要加双引号,timestamp要将string类型的转换为timestamp类型

INSERT INTO "SystemLog"("Source","Level","Content","CreatedAt") VALUES(@source, @level, @content, TO_TIMESTAMP(@createdAt, 'YYYY-MM-DD HH24:MI:SS'));

</ commandText >

<!-- database connection parameters ${logger} Server--> < -数据库中要写的字段- >

< parameter name = "@source" layout = "Server" />

< parameter name = "@level" layout = "${level}" />

< parameter name = "@content" layout = "${message}" />

< parameter name = "@createdAt" layout = "${date}" />

</ target >

<!--</target>-->

</ targets >

<!-- rules to map from logger name to target -->

< rules >

<!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL警告级别控制-->

< logger name = "*" minlevel = "Trace" writeTo = "allfile" />

<!--INFO,WARN,ERROR,FATAL-->

< logger name = "AiEcgWebApi.Controllers.*" minlevel = "Warn" writeTo = "db" />

<!--DEBUG,INFO,WARN,ERROR,FATAL-->

< logger name = "*" minlevel = "Debug" writeTo = "ownFile-web" />

</ rules >

</ nlog >

(3)App.cs注入log组件

protected override void RegisterTypes ( IContainerRegistry containerRegistry )

var factory = new NLog . Extensions . Logging . NLogLoggerFactory ;

Microsoft . Extensions . Logging . ILogger logger = factory . CreateLogger ( "NLog" );

containerRegistry . RegisterInstance ( logger );

(4)ViewModel构造函数获取log引用

public MainWindowViewModel ( ILogger logger )

logger . LogInformation ( "hhhhhhh" );

Part1.1 全局异常捕捉

出错的任务中未观察到的异常将触发异常呈报策略时出现。

/// <summary>

/// 应用程序启动时创建Shell

/// </summary>

/// <returns></returns>

protected override Window CreateShell

//UI线程未捕获异常处理事件

this . DispatcherUnhandledException += OnDispatcherUnhandledException ;

//Task线程内未捕获异常处理事件

TaskScheduler . UnobservedTaskException += OnUnobservedTaskException ;

//多线程异常

AppDomain . CurrentDomain . UnhandledException += OnUnhandledException ;

return Container . Resolve < MainWindow > ;

Part1.2 Dump

程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析。(该文件包含一些敏感信息切勿将公司项目中的dump文件公布到互联网上)

Windebug分析案例:

https://mp.weixin.qq.com/s/i6cJHTrIPweDIplzzfHnVQ

Windebug分析教程:

Windebug命令:

Part2 控件库

1.Nuget安装:MaterialDesignInXamlToolkit

2.选择主题

Light theme: < ResourceDictionary Source = "pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />

Dark theme: < ResourceDictionary Source = "pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />

3.App文件:

< Application x:Class = "MaterialTest.App"

xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"

StartupUri = "MainWindow.xaml" >

< Application.Resources >

< ResourceDictionary >

< ResourceDictionary.MergedDictionaries >

< ResourceDictionary Source = "pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />

< ResourceDictionary Source = "pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />

< ResourceDictionary Source = "pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />

< ResourceDictionary Source = "pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />

</ ResourceDictionary.MergedDictionaries >

</ ResourceDictionary >

</ Application.Resources >

</ Application >

4.配置View

< Window [...]

TextElement.Foreground = "{DynamicResource MaterialDesignBody}"

Background = "{DynamicResource MaterialDesignPaper}"

TextElement.FontWeight = "Medium"

TextElement.FontSize = "14"

FontFamily = "pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"

[...] >

返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。