Elmah for Glimpse——两全其美






4.65/5 (16投票s)
为 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>
我们还需要做两件事才能使一切正常运行
- 让 Elmah 捕获并记录所有未处理的异常。
- 公开一个网页以允许用户查看 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
- 初始版本