【UWP】在 UWP 中使用 Exceptionless 进行遥测
2020年4月10日更新:
官方 nuget 新版本已发布
https://www.nuget.org/packages/Exceptionless
2020年1月17日更新:
nightly build 版本已发布
https://www.myget.org/feed/exceptionless/package/nuget/Exceptionless
2020年1月16日更新:
PR 已合并了,等待官方发布新的 nuget 包
2020年1月10日更新:
clone 官方源码调了一下找到问题所在了,UWP 的 release 模式下, Assembly.GetCallingAssembly() 不可用导致,已给 Exceptionless 发 PR 了。
https://github.com/exceptionless/Exceptionless.Net/pull/219
2020年1月9日更新:
目前 Exceptionless 存在 bug,导致在 UWP 的 release 模式下不可用,已给官方提 bug
https://github.com/exceptionless/Exceptionless.Net/issues/218
各位看官暂时不用往下看了。
前几个星期在公司的测试服务器上搭建了 Exceptionless 对公司的 Asp.net core 项目进行遥测。在之前都是远程桌面登录上去,然后去翻日志文件看有没有异常,效率极其的低。用了 Exceptionless 之后,效率高了不少,而且能收集到更多信息了。
最近准备要过年了,项目也上线了一段时间趋于稳定,算是比较闲了一点。想着要不把手上的 UWP 项目也加上 Exceptionless 进行遥测吧,毕竟微软商店的 Dashboard 那异常也几乎是看不出啥的,而且这测试服务器性能又是过剩的,不用白不用。
但我一操作起来,就发现了个大问题,Exceptionless 官方并没有提供 UWP 的库(Winform、WPF、asp.net core 的都有)。翻查了 github 上相关的 issue,官方建议是用 .net standard 版本的。然而实际操作之后,我发现还需要额外的代码来处理 UWP 中的 UnhandledException,本文就记录一下。
首先当然是在 Exceptionless 平台上创建项目获取 ApiKey 了,这个就不多说了。然后 UWP 项目引用 Exceptionless 的 nuget 包。
在 App.xaml.cs 的构造函数中添加 SetUpExceptionless 代码:
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
SetUpExceptionless();
}
然后先初步实现 SetUpExceptionless 方法:
private void SetUpExceptionless()
{
var client = ExceptionlessClient.Default;
client.Configuration.ServerUrl = "";
client.Configuration.ApiKey = ""; client.Startup();
}
由于是自建 Exceptionless 平台,所以需要配置一下 ServerUrl。ApiKey 配置为从平台获取到的 ApiKey。
接下来是处理 UnhandledException,在 UWP 平台中,有两种情况,一种是在 App 类上触发的,另一种是在 AppDomain 上触发的。这两种我们都要监听到。但如何监听呢,这里先看看官方在 WPF 平台是如何实现的:

主要是图上红框的两行,第一行主要是捕获线程的异常,第二行捕获了 App 的异常。而捕获线程异常的方法内部用到了 Winform 的类,这里我们就忽略,因为 UWP 里没有这些类,而且 UWP 中非 UI 线程的异常是可以通过 AppDomain.UnhandledException 事件来捕获的。这里我们看第二行的实现:

可见是对 System.Windows.Application.Current.DispatcherUnhandledException 事件进行了订阅,然后给 Exceptionless。
依样画葫芦,完善我们的 SetUpExceptionless 方法:
private void SetUpExceptionless()
{
var client = ExceptionlessClient.Default;
client.Configuration.ServerUrl = "";
client.Configuration.ApiKey = ""; UnhandledException += (sender, args) =>
{
var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("App_UnhandledException"); args.Exception.ToExceptionless(contextData, ExceptionlessClient.Default).Submit(); client.ProcessQueue();
};
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
var exception = args.ExceptionObject as Exception;
if (exception == null)
{
return;
} var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("AppDomain_UnhandledException"); exception.ToExceptionless(contextData, ExceptionlessClient.Default).Submit(); client.ProcessQueue();
}; client.Startup();
}
接下来我们测试一下是否起效,先手动抛个异常,我就直接建一个 Button,然后 Click 抛个异常好了。
private void TestButton_Click(object sender, RoutedEventArgs e)
{
throw new Exception("测试 Exceptionless 集成");
}
运行后,点击按钮,然后 App 炸掉之后我们去看 Exceptionless 平台。

完美!
【UWP】在 UWP 中使用 Exceptionless 进行遥测的更多相关文章
- UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv
原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...
- UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...
- [UWP]理解ControlTemplate中的VisualTransition
1. 前言 VisualTransition是控件模板中的重要组成部分,无论是自定义控件或者修改控件样式都会接触到VisualTransition.明明这么重要,博客园上好像都没多少关于VisualT ...
- [UWP]在UWP平台中使用Lottie动画
最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...
- UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
UWP 中使用 WebView 时可以在网页中额外执行一些代码.于是你几乎可以在网页上做任何事情,那些你可以在浏览器控制台中做的事情. 本文将介绍做法. 本文内容 准备环境 执行 JavaScript ...
- UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)
在 Windows 10.0.16299 中,RevealBrush 被引入,可以实现炫酷的鼠标滑过高亮效果和点击光照.本文将告诉大家如何完整地实现这样的效果. Reveal 的效果(自带) 在微软官 ...
- 在UWP的XAML中使用原始类型
问题: I'm trying to access the system namespace for StaticResource variables in XAML on UWP. Here's (m ...
- UWP 在Xaml中使用cu和fcu资源
之前一直不知道这个,最近看微软的WTS项目更新,在Xaml中定义了 xmlns:fcu ="http://schemas.microsoft.com/winfx/2006/xaml/pres ...
- UWP 查找模板中的控件
这个标题我也不知道咋起,意思说一下你就明白. 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,GridView等. 2. 在设计的情况下并没有这个控件,而在 ...
随机推荐
- Codeforces 1304E 1-Trees and Queries (树上距离+思维)(翻译向)
题意 给你一棵树,q个询问(x,y,a,b,k),每次问你如果在(x,y)加一条边,那么a到b能不能走k步,同一个点可以走多次 思路(翻译题解) 对于一条a到b的最短路径x,可以通过左右横跳的方法把他 ...
- k8s系列----索引
day1:k8s集群准备搭建和相关介绍 day2:k8spod介绍与创建 day3:k8sService介绍及创建 day4:ingress资源和ingress-controller day5:存储卷 ...
- 分享下超实用的用skura frp做内网穿透的经验
操作目的: 使无公网ip的主机能被外网访问,实现ssh对服务器的远程管理 硬件准备: 1.服务端:skura frp主机(skura frp 免费提供,有待创建) 2.客户端:接在无线路由器(内网)上 ...
- Qps从300到1500的优化过程
最近压测一项目,遇到的性能问题比较典型,过程记录下来,给大家做定位调优参考: 表象: 单接口负载测试,qps最高到300,响应时间200ms,应用cpu达到90%以上,8c机器,如下图,写到这里可能有 ...
- js函数与作用域,了解函数基本概念
通过js基础语法了解到js的值包含数字,字符串和布尔值;js运算符分为算数,赋值,比较和逻辑运算符;js的流程控制包含条件判断if,switch选择;循环for while:下面js的函数及作用域,学 ...
- ES6 - 基础学习(3): 变量的解构赋值
解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...
- [MySQL]ANALYZE TABLE 更新索引基数
MySQL使用存储的键分布基数来确定表连接顺序在决定对查询中的特定表使用哪些索引时,也会使用使用键分布基数 ANALYZE TABLE 表名 可以更新表的索引基数,使其更接近非重复的记录数,记录数可以 ...
- JN_0019:CMD命令窗口常用操作
1,回到根目录下 cd\ 2,
- Python——模块和包
一.概念 """模块():一个python文件,以 .py 结尾,包含python对象定义和语句.模块可以定义函数.类.变量,也可包含可执行文件 导入模块: 1.impo ...
- C#设计模式学习笔记:(5)原型模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用. 一.引言 很多人说原型设计模式会节省机器内存,他们说 ...