65.9K
CodeProject 正在变化。 阅读更多。
Home

WinRT 应用程序异常日志记录

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (8投票s)

2013年11月30日

CPOL

4分钟阅读

viewsIcon

21799

使用 WinrtErrLog 和 Google 电子表格进行 WinRT 应用异常日志记录。

引言

WinrtErrLog 是一个小的 C# 库,它可以帮助应用程序将异常详细信息发布到 Google 表单并将其保存到 Google 电子表格。

背景

SMTP 需要访问硬盘驱动器中的每个位置,才能将日志导出到特定文件夹,以便用户可以将日志通过电子邮件发送给所有者。 由于 WinRT 在沙箱模式下运行,因此它无法访问硬盘驱动器中的每个文件夹,因此此选项对于异常处理是不可行的。

此外,还有许多付费替代方案可用,这些替代方案以直观的基于 Web 的仪表板形式提供异常日志,例如,MarkedUpRaygunBugSense 等。 使用这些付费解决方案,需要创建一个 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 的列表,如下所示

  1. 表单 ID =1LGucOB8X-2uhBi6ehkvzxSd4M-dcDUNGSqQ07ULl7Qs
  2. 异常类型 =36961725
  3. 异常消息 = 1390140898
  4. 异常堆栈跟踪 = 752959316
  5. 异常源 = 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 电子表格,可以轻松记录异常详细信息。 您可以添加任意数量的字段并分析崩溃和异常报告。

© . All rights reserved.