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

Elmah for Glimpse——两全其美

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (16投票s)

2011年5月18日

Apache

9分钟阅读

viewsIcon

54390

为 Glimpse 创建 Elmah 插件。

介绍 Elmah

我们都知道 Elmah,对吧?它是 NuGet 上最受欢迎的包之一。对于那些不太了解或不使用 Elmah 的人,我将简要解释它提供的功能以及如何在您的应用程序中使用它。

Elmah 代表错误日志模块和处理程序。它是一个应用程序范围的错误日志记录库,可以记录几乎所有未处理的异常。它提供一个网页,让您(远程)查看已记录异常的日志。此日志不仅包含错误消息,还包括完整的堆栈跟踪以及错误发生时所有服务器变量的值。

在 ASP.NET MVC 中使用 Elmah

由于我们有了 NuGet,在 ASP.NET MVC 应用程序中设置 Elmah 变得非常容易。右键单击您的 Web 应用程序,然后选择“添加库包引用…”以弹出 NuGet 包管理器。搜索 Elmah 并安装它。安装后,Elmah 将被添加为项目引用。

下一步是配置 Elmah。我在这里不会详细介绍。我们将仅设置 Elmah 以将所有错误记录到内存存储中,并通过网页公开这些错误。首先,我们将以下代码添加到 <configSections> 节点,以使 Elmah 从您的 web.config 读取其配置。

<sectiongroup name="elmah">
  <section name="errorLog" type="Elmah.ErrorLogSectionHandler, Elmah" 
	requirepermission="false">
</sectiongroup>

Elmah 允许您将错误记录到多个存储中。它们目前支持 Microsoft SQL Server、Oracle、SQLite、Access、XML 文件、内存、SQL CE、MySQL 和 PostgreSQL。在您的 web.config 中插入下面的代码以将错误记录到内存存储。使用内存存储库时,所有记录的错误将在应用程序重新启动时消失。

<elmah>
  <errorlog type="Elmah.MemoryErrorLog, Elmah">
</elmah>

我们还需要做两件事才能使一切正常运行

  1. 让 Elmah 捕获并记录所有未处理的异常。
  2. 公开一个网页以允许用户查看 Elmah 捕获的所有内容。

为了实现这一点,我们必须添加一个 HTTP 模块和一个 HTTP 处理程序。该模块负责记录异常,而 HTTP 处理程序将呈现一个包含错误列表的页面。您必须将这些部分添加到 <system.web> 节点和 <system.webServer> 节点,以支持经典模式和集成模式运行的 IIS。有关此内容的更多信息可以在 MSDN 上找到 – 如何:注册 HTTP 处理程序

<system.web>
  <httphandlers>
    <add type="Elmah.ErrorLogPageFactory, Elmah" 
       verb="POST,GET,HEAD" path="elmah.axd">
  </httphandlers>
 
  <httpmodules>
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah">
  </httpmodules>
</system.web>

<system.webserver>   
  <modules runallmanagedmodulesforallrequests="true">
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah">
  </modules>
 
  <handlers>
    <add name="Elmah" type="Elmah.ErrorLogPageFactory, Elmah" 
       verb="POST,GET,HEAD" path="elmah.axd" 
       precondition="integratedMode">
  </handlers>
</system.webserver>

让我们仔细看看 HTTP 处理程序的注册。我们指定了一个路径‘elmah.axd’,这意味着该处理程序仅在我们浏览到该特定路径时才启动。所以,让我们启动应用程序并看看。如果我浏览到 https:///elmah.axd,我就会看到这个

哦,它甚至更好。让我们点击错误消息旁边的“详细信息”链接。这就是魔法发生的地方

这真的很棒;我们得到了大量关于错误发生时情况的信息。如果发生应用程序错误,我们可以几乎立即找出问题所在。

显然,您不希望给访问您网站的每个人访问此日志的权限,因为用户可能会发现您代码中的重要问题并加以利用。您可以通过多种方式阻止对此日志的访问(无远程访问、通过 ASP.NET 授权……)。有关此主题的更多信息可以在此处找到:Elmah:保护错误日志页面

介绍 Glimpse

大多数人可能知道 Firebug。实际上,Glimpse 与 Firebug 非常相似,只不过它是在客户端用 JavaScript 实现的,并在服务器端与 ASP.NET 集成。Firebug 对客户端做什么,Glimpse 就对服务器做什么……换句话说,它是一个客户端视角,可以了解服务器上发生的情况。

目前 Glimpse 只能用于针对 .NET 4.0 的 Web 应用程序;但是 Glimpse 团队目前正在开发一个支持 .NET 3.5 的版本。事实上,Glimpse 不仅仅是一个 .NET 工具;目前它仅适用于 ASP.NET MVC 和 Web Forms,但最终它将支持 Ruby on Rails、PHP 等。

对于 ASP.NET MVC 3,它目前已经包含了一系列很棒的功能,例如

  • Ajax 调用跟踪
  • 路由调试
  • 请求检查
  • 服务器变量检查
  • 会话检查
  • .NET 跟踪(不再需要 trace.axd

在 ASP.NET MVC 中使用 Glimpse

将 Glimpse 与 ASP.NET MVC 集成非常容易。它作为一个 NuGet 包提供,因此安装它实际上只需要大约 30 秒。让我们来看看……右键单击您的 Web 应用程序,然后选择“添加库包引用…”来弹出 NuGet 包管理器。搜索 Glimpse 并安装它。

Glimpse NuGet 包将自动引用正确的程序集,并将一个配置节添加到您的 web.config。您要做的唯一一件事就是让它正常运行:

  • 启动您的应用程序
  • 浏览到:https:///Glimpse/Config
  • 点击“开启 Glimpse”。

  • 返回您的应用程序,现在您应该看到类似这样的内容

这些 Glimpse 的家伙开发的东西真是令人惊叹。目前 Glimpse 仍处于 beta 阶段,但在我看来,它已经足够稳定,可以集成到您所有当前的 ASP.NET 项目中。

Elmah for Glimpse - 兼具两者之长

Scott Hanselman,被非正式地称为微软最有趣的人,最近将 Glimpse 评为 “本周 NuGet 包”。在文章的最后,他说:

“Glimpse 和 ELMAH 一起,正式成为我最喜欢的 ASP.NET MVC 插件。我将每天使用它,并建议您也这样做。”

那么……将 Elmah 与 Glimpse 集成不是很有意义吗?

插件系统

Glimpse 有一个非常简洁的插件系统。在内部,它们使用 MEF 来发现扩展。最棒的是,编写 Glimpse 插件非常简单。您需要做的就是:

  • 实现 IGlimpsePlugin 接口。
  • GlimpsePlugin 属性装饰您的类。

让我们来看看我的 Elmah for Glimpse 插件。

[GlimpsePlugin]
public class ElmahPlugin : IGlimpsePlugin
{
  public string Name
  {
    get { return "Elmah"; }
  }
 
  public object GetData(HttpApplication application)
  {
    if (application == null || application.Context == null)
      return null;
 
    var errorList = new List<errorlogentry>();
    var errorCount = ErrorLog
          .GetDefault(application.Context)
          .GetErrors(0, 15, errorList);

    if (errorCount == 0)
      return null;
 
    var data = new List<object[]>
    {
      new object[]
      {
         "Host", "Code", "Type", 
         "Error", "User", "Date", "Time"
      }
    };
 
    data.AddRange(
      errorList.Select(
        errorEntry => new object[]
    {
          errorEntry.Error.HostName,
      errorEntry.Error.StatusCode,
      errorEntry.Error.Type,
      errorEntry.Error.Message,
      errorEntry.Error.User,
      errorEntry.Error.Time.Date.ToShortDateString(),
      errorEntry.Error.Time.ToShortTimeString()
        }));
 
    return data;
  }
 
  public void SetupInit(HttpApplication application)
  {
    throw new NotImplementedException();
  }
}

在上面的代码示例中,您可以看到我实现了 IGlimpsePlugin 接口。该接口具有以下方法:

  • Name 属性的 getter:此属性将用作 Glimpse 用户界面中选项卡的名称。
  • GetData 方法:接受一个 HttpApplication 参数并返回一个对象。您返回的对象将被序列化为 JSON,发送到客户端,并由 Glimpse UI 渲染。如何渲染取决于您返回的对象类型。有关更多详细信息,请参见 Glimpse 协议页面。
  • SetupInit 方法:这是您执行任何需要进行的初始化的地方。此方法将运行一次(当您的插件首次加载时)。如果您希望 Glimpse 调用此方法,您需要将 GlimpsePlugin 属性上的 ShouldSetupInInit 属性设置为 true[GlimpsePlugin(ShouldSetupInInit=true)]

GetData 方法是您应该决定要渲染什么以及如何渲染的地方。如果此方法返回 null,则您的选项卡将在 Glimpse UI 中禁用。

在上面的实现中,如果 HTTP 上下文不可用或尚未记录任何错误,我将返回 null。如果有错误被记录,我将它们作为对象列表返回。列表中的第一项将用作标题行;所有后续行都是数据行。目前只将最后 15 个错误返回给用户。

更新 2011/05/31:上面的代码示例和随之而来的解释不再完全有效,但为了文档的目的,我将其保留为最初的样子。

NuGet包

Elmah for Glimpse 插件可作为 NuGet 包使用。要安装该包,请右键单击您的 Web 应用程序,然后选择“添加库包引用…”搜索“Glimpse”、“Elmah”或“Glimpse.Elmah”,包管理器将弹出“Elmah for Glimpse 插件”。

该包具有 Glimpse 和 Elmah 的依赖项,因此如果您尚未安装这些包,NuGet 也会自动获取它们。如果您以前没有 Elmah,您可能仍需要配置它。

安装包后,您仍然需要将 Elmah for Glimpse 客户端脚本包含在您的页面中,最好是在您的主母版页中。

<script src="<%: Url.Content("~/Glimpse/Resource/?resource=Pager") %>" 
type="text/javascript"></script>

让我们再次运行我们的应用程序,看看会发生什么。我们的 Elmah 插件已作为引用添加到项目中,因此它将被 Glimpse 插件系统发现。Glimpse 将其加载到其 UI 中,瞧,我们成功了!

NuGet 示例包

最容易上手的方法是获取 “Elmah for Glimpse 示例插件”包,该包也可以通过 NuGet 获取。

只需创建一个新的空白 ASP.NET MVC 3 应用程序,然后添加对 Elmah for Glimpse 示例插件包的库包引用。该包将自动:

  • 安装 Glimpse。
  • 安装 Elmah。
  • 安装 Elmah for Glimpse 插件。
  • 安装 jQuery。
  • 配置所有内容。
  • 创建一个新的控制器、模型和视图,以便您可以引发一些随机异常。

安装包后,您就有了一个可以引发异常的应用程序!很酷吧!?好了,让我们运行应用程序,引发一些异常,看看会发生什么。

如果您尝试运行示例,但没有看到 Glimpse 插件,您可能仍需要启用它。请参考“在 ASP.NET MVC 中使用 Glimpse”部分了解如何操作。

未来

如果您希望看到任何功能实现,您可以随时在 CodePlex 上的项目主页上提交功能请求。如果您想自己实现某个功能,可以 fork 该项目并提交一个 pull request。

我正在为下一个版本考虑以下几点:

  • 添加某种配置(页面大小,...)。
  • 自动包含客户端脚本。

发布说明

  • 06/05/2011 - 0.9.3.0
    • 实现了 IProvideGlimpseHelp 接口。
    • 将默认页面大小更改为 10。
    • 修复了分页器脚本中的错误。
  • 06/03/2011 - 0.9.2.0
    • 更新到 Glimpse 版本 0.82。
    • 更新到 Elmah 版本 1.2.0.1。
  • 05/31/2011 - 0.9.1.0
    • 添加了详细信息链接。
    • 添加了分页器。

  • 05/18/2011 - 0.9.0.0
    • 初始版本
© . All rights reserved.