WinRT 应用程序异常日志记录






4.80/5 (8投票s)
使用 WinrtErrLog 和 Google 电子表格进行 WinRT 应用异常日志记录。
引言
WinrtErrLog 是一个小的 C# 库,它可以帮助应用程序将异常详细信息发布到 Google 表单并将其保存到 Google 电子表格。
背景
SMTP 需要访问硬盘驱动器中的每个位置,才能将日志导出到特定文件夹,以便用户可以将日志通过电子邮件发送给所有者。 由于 WinRT 在沙箱模式下运行,因此它无法访问硬盘驱动器中的每个文件夹,因此此选项对于异常处理是不可行的。
此外,还有许多付费替代方案可用,这些替代方案以直观的基于 Web 的仪表板形式提供异常日志,例如,MarkedUp
、Raygun
、BugSense
等。 使用这些付费解决方案,需要创建一个 Web 服务,该服务可以将异常日志存储在数据库中,使用启用 IIS 的 Web 服务器来托管 Web 服务,并且还需要 MS-SQL 数据库。
使用 Google 表单进行日志记录
Google 表单主要是一种工具,大量用于调查、活动策划和轻松收集信息。 它可以轻松连接到 Google 电子表格,并且响应将自动发送到 Google 电子表格。
Google 表单是保存异常详细信息的好方法,其中 Google 电子表格可用于查看异常日志。 它是免费提供的。
如何创建 Google 表单?
- 使用 Gmail 帐户登录并打开 Google 云端硬盘。
- 单击左侧的“创建”按钮。
- 从下拉菜单中选择“表单”。
Google 表单提供了广泛的选项来创建表单,但为此只需要四个字段,它们将充当四个列。
- 异常类型
- 异常消息
- 异常堆栈跟踪
- 异常源
使用所有四个文本项目和适当的问题标题,最终表单应如下所示
创建表单后,下一步将是创建电子表格并将其与创建的表单链接。 在这种情况下,“My XYZ App Exception Log”。
系统将提示您创建新的电子表格或选择现有的电子表格。 强烈建议创建新的电子表格,而不是使用“选择响应目标”。
单击“查看响应”以打开电子表格。
WinrtErrLog
正如我在简介中所说,WinrtErrLog
是一个小的 C# 库,它可以帮助应用程序将异常详细信息发布到 Google 表单并将其保存到 Google 电子表格。 它使用异步编程和 HttpClient
进行 HTTP POST
请求。
如何使用 WinrtErrLog
现在只需在您的项目中添加 WinrtErrLog
。 但是您需要从 Google 表单源代码中提取一些东西。 您需要的第一件事是表单 ID。 每个 Google 表单在 URL 中都有一个唯一的 ID。
单击“查看在线表单”,您将能够看到完整的 URL,如下所示
docs.google.com/forms/d/1LGucOB8X-2uhBi6ehkvzxSd4M-dcDUNGSqQ07ULl7Qs/viewform
在上面的 URL 中,表单 ID 为 “1LGucOB8X-2uhBi6ehkvzxSd4M-dcDUNGSqQ07ULl7Qs
”。 我们还需要每个字段的 ID。 可以使用浏览器的开发人员工具或 Firebug 从 Google 表单的源代码中查找字段 ID。
这篇文章将向您展示如何使用 Google Chrome 查找 Google 表单的源 ID。 首先,打开在线 Google 表单,然后按 F12 打开开发人员工具。 现在您可以选择一个元素并使用开发人员工具对其进行检查。 为此,请选择“Elements”选项卡,然后单击底部栏中的“放大镜”按钮。 它允许您检查网页中的特定元素。
将光标悬停在“异常类型”下方的文本框上,然后单击它。 对其他也重复相同的操作。 这将提供五个 ID 的列表,如下所示
- 表单 ID =
1LGucOB8X-2uhBi6ehkvzxSd4M-dcDUNGSqQ07ULl7Qs
- 异常类型 =
36961725
- 异常消息 =
1390140898
- 异常堆栈跟踪 =
752959316
- 异常源 =
628132246
代码
提取所有必需的 ID 后,需要提供一些故意的异常进行测试。 在这篇文章中,DivideByZeroException
用于测试。
private void WinrtErrLogTest()
{
int zero = 0;
try
{
var result = 9 / zero;
}
catch (Exception) // It will definitely throw DivideByZeroException
{
throw;
}
}
WinrtErrLog
的所有方法都是异步的,但 WinRT 不允许在 catch
主体中使用 await
关键字。 因此,将使用 private
字段来保存抛出的异常。 如果 private
变量不为 null
,则表示已抛出异常,并且 WinrtErrLog
将处理它。
private async Task WinrtErrLogTest()
{
Exception ex = null;
int zero = 0;
try
{
var result = 9 / zero;
}
catch (Exception ee)
{
ex = ee;
}
if (ex != null)
{
// If exception thrown then WinrtErrLog will save
// exception details to Google spreadsheets via Google Form.
}
}
WinrtErrLog
只有一个名为 ErrorLogger
的类。 要初始化它,需要将 Form ID 作为其构造函数的参数传递。
AddEntry
的方法,它接受两个参数,第一个是从使用开发人员工具提取的 “entry.00000
” 中的字段 ID “00000
”,第二个是实际值。 实际值可以是异常源、消息、堆栈跟踪等。private async Task WinrtErrLogTest()
{
Exception ex = null;
int zero = 0;
try
{
var result = 9 / zero;
}
catch (Exception ee)
{
ex = ee;
}
if (ex != null)
{
var objErrorLogger = new ErrorLogger("1LGucOB8X-2uhBi6ehkvzxSd4M-dcDUNGSqQ07ULl7Qs");
objErrorLogger.AddEntry("36961725", ex.GetType().Name);
objErrorLogger.AddEntry("1390140898", ex.Message);
objErrorLogger.AddEntry("752959316", ex.StackTrace);
objErrorLogger.AddEntry("628132246", ex.Source);
var objHttpResponse = await objErrorLogger.UploadAsync();
if (objHttpResponse.IsSuccessStatusCode)
{
System.Diagnostics.Debug.WriteLine("Exception logged successfully.");
}
else
{
System.Diagnostics.Debug.WriteLine
("Error while exception logging. HTTP status : " + objHttpResponse.StatusCode);
}
}
}
运行代码看看会发生什么
注意:Google 电子表格本身会添加时间戳。
通过这种方式,借助 Google 表单和 Google 电子表格,可以轻松记录异常详细信息。 您可以添加任意数量的字段并分析崩溃和异常报告。