AnLogger - ASP.NET 日志记录器






4.60/5 (10投票s)
通过电子邮件轻松快速地记录 ASP.NET 异常,并将异常存储在文件系统中。
目录
- 引言
- AnLogger 概述
- ILogger
- EmailLogger
- FileLogger
- ExceptionFormatter
- EmailSender
- ConfigurationReader
- ConfigurationItems
- MoreAboutTheError
- 配置
- 如何使用 AnLogger?
- 测试和结果
- 限制
- 历史
引言
AnLogger
是一个 ASP.NET 日志记录库。该库的主要任务是通过电子邮件将异常详细信息发送给指定的收件人,或将异常详细信息存储在文件系统中。它是一个简单、快速且易于使用的 ASP.NET 应用程序异常日志记录库。已经有很多 ASP.NET 异常日志记录器,尤其是 ELMAH,但与那些日志记录器不同的是,AnLogger
是一个非常简单、易用且轻量级的 ASP.NET 异常日志记录库。
AnLogger 概述
AnLogger
是一个轻量级的 ASP.NET 错误日志记录库。它极其易于使用和配置。目前 AnLogger
支持:
- 通过发送电子邮件记录异常详细信息。
- 通过将异常详细信息保存到主机服务器文件系统中的文件中来记录异常详细信息。
使用 AnLogger
很简单,获取 AnLogger
的二进制文件,将其添加到 Web 项目的引用中,配置一些内容,然后从 AnLogger
库调用其中一个日志记录器(EmailLogger
或 FileLogger
)。
AnLogger
接受一个异常对象作为参数,使用标准的 .NET Framework 异常格式化函数将其格式化为 HTML,然后通过 SmtpClient
将格式化后的数据保存到文件系统或发送给指定的收件人。
从架构角度来看,AnLogger
是一个轻量级库。它目前包含以下类来记录异常详细信息:
AnLogger 使用的类的简要描述
ILogger
这是 AnLogger
的接口定义。该接口目前包含三个方法,将由 AnLogger
使用的所有 Logger
实现:
namespace AnLogger
{
using System;
using System.Web;
public interface ILogger
{
void Log(Exception exceptionDetails);
void Log(Exception exceptionDetails, HttpRequest httpRequest);
void Log(string formattedExceptionDetails);
}
}
EmailLogger
它负责通过电子邮件将异常详细信息发送给收件人来记录异常。它使用标准的 .NET 格式化函数将异常对象格式化为 HTML 格式数据,并将这些数据作为消息内容发送给配置中指定的收件人。EmailLogger
实现为两个重载方法,职责如下:
namespace AnLogger
{
using System;
using System.Web;
public class EmailLogger : ILogger
{
// To log exception details from Exception objects via Email.
public void Log(Exception exceptionDetails)
{
EmailSender.SendExceptionDetails
(ExceptionFormatter.GetHtmlFormmatedException(exceptionDetails),
exceptionDetails.Message);
}
public void Log(Exception exceptionDetails, HttpRequest httpRequest)
{
var formattedExceptionDetails =
ExceptionFormatter.GetHtmlFormmatedException(exceptionDetails);
formattedExceptionDetails = formattedExceptionDetails.Replace
("", string.Concat(new MoreAboutTheError
(httpRequest).ConstructTheSummary(), ""));
EmailSender.SendExceptionDetails(formattedExceptionDetails,
exceptionDetails.Message);
}
// To log exception details from provided exception details data.
public void Log(string formattedExceptionDetails)
{
EmailSender.SendExceptionDetails(formattedExceptionDetails);
}
}
}
Log(Exception exceptionDetails)
- 它接受一个异常对象,使用名为
HttpUnhandledException
的内置 .NET 类进行处理,并将处理后的数据作为电子邮件发送。
- 它接受一个异常对象,使用名为
Log(string formattedExceptionDetails)
- 它接受预先格式化的异常对象数据并将其作为电子邮件发送。
Log(string formattedExceptionDetails, HttpRequest httpRequest)
- 它接受预先格式化的异常对象数据和当前的
HttpRequest
对象,并将其作为电子邮件发送。
- 它接受预先格式化的异常对象数据和当前的
FileLogger
它负责将格式化的异常详细信息写入文件系统来记录异常。它将通过读取 web.config 的 appsettings 来使用默认文件路径。
public class FileLogger : ILogger
{
// To log exception details from Exception object into file.
public void Log(Exception exceptionDetails)
{
FileWriter.WriteToFile
(ExceptionFormatter.GetHtmlFormmatedException(exceptionDetails));
}
public void Log(string formattedExceptionDetails)
{
FileWriter.WriteToFile(formattedExceptionDetails);
}
public void Log(Exception exceptionDetails, System.Web.HttpRequest httpRequest)
{
var formattedExceptionDetails =
ExceptionFormatter.GetHtmlFormmatedException(exceptionDetails);
FileWriter.WriteToFile(formattedExceptionDetails.Replace
("", string.Concat(new MoreAboutTheError
(httpRequest).ConstructTheSummary(), "")));
}
}
EmailLogger
和 FileLogger
是 AnLogger
库的核心类,还有其他使用的类,例如:
ExceptionFormatter
此类负责使用内置的 .NET 功能将 .NET Exception 对象格式化为 HTML 格式数据。
namespace AnLogger
{
using System;
using System.Web;
internal static class ExceptionFormatter
{
// It will format the exception message and stack trace from
// exception object into formatted HTML code.
internal static string GetHtmlFormmatedException(Exception exceptionToFormat)
{
HttpUnhandledException httpUnhandledException =
new HttpUnhandledException(exceptionToFormat.Message, exceptionToFormat);
return httpUnhandledException.GetHtmlErrorMessage();
}
}
}
从上面的代码可以看出,HttpUnhandledException
是用于将异常对象格式化为 HTML 格式数据的类。
EmailSender
它负责使用 SmtpClient
发送电子邮件。为了让 AnLogger
能够发送电子邮件,web.config 必须在配置文件中包含一些值。这在本文的 Configuration
部分进行了广泛讨论。
ConfigurationReader
从配置文件(如 web.config)中读取配置项。
ConfigurationItems
此 enum
包含 AnLogger
用来配置自身的、作为值的配置项。因此,enum
将由不同的类使用,例如 EmailSender
或 FileWriter
类来读取配置项。
enum ConfigurationItems
{
To = 0,
From,
SmtpServer,
DefaultFilePath,
}
因此,在 web.config 文件的 appsettings 部分也将有四个配置项。
配置
目前 AnLogger
使用四种不同的配置项(DefaultFilePath, To, From, SmtpServer)。所有这些项都与电子邮件地址、SMTP 服务器地址等相关。
<appsettings>
<add key="DefaultFilePath" value="default path name to store file">
<add key="To" value="username@domainname">
<add key="From" value="username@domainname">
<add key="SmtpServer" value="smtp server address">
</add></add></add></add>
</appsettings>
所有这些配置项都用于不同的目的,例如,获取电子邮件地址、SMTP 服务器地址等。下表描述了这些项:
配置项 | 描述 |
DefaultFilePath |
它将定义文件路径的位置,FileLogger 将在此处存储包含异常详细信息的文件。以下示例将展示如何在 web.config 中定义 DefaultFilePath 。<add key="DefaultFilePath"
value="default path name to store file" />
|
改为 |
它将包含发送电子邮件的收件人地址。<add key="To" value="username@domainname" />
|
从 |
它将包含发件人地址。<add key="From" value="username@domainname" />
|
SmtpServer |
SMTP 服务器地址的名称。<add key="SmtpServer" value="smtp server address" />
|
MoreAboutTheError
namespace AnLogger
{
using System;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
public class MoreAboutTheError
{
private string host;
private string url;
private string date;
private string time;
private string requestTypes;
private string totalBytes;
private string cookies;
private string browserDetails;
private string headerDetails;
private const string LineBreak = "<br/>";
public MoreAboutTheError(HttpRequest request)
{
host = request.Url.Host;
url = request.Url.AbsoluteUri;
date = DateTime.Now.Date.ToShortDateString();
time = DateTime.Now.ToShortTimeString();
headerDetails = HeaderDetails(request);
requestTypes = request.RequestType;
totalBytes = request.TotalBytes.ToString() + "bytes";
browserDetails = GetBrowserDetails(request);
cookies = GetCookieDetails(request);
}
public string ConstructTheSummary()
{
//Code has been removed for simplicity
}
private void AddCellContents(HtmlTextWriter writer, string contents)
{
//Code has been removed for simplicity
}
private static void AddCellHeader(HtmlTextWriter writer,
string dataToWrite, string textAlign = "Right")
{
//Code has been removed for simplicity
}
private string HeaderDetails(HttpRequest request)
{
//Code has been removed for simplicity
}
private string GetBrowserDetails(HttpRequest request)
{
//Code has been removed for simplicity
}
private string FormateWithLineBreak(string item1, string item2)
{
return string.Format("{0} : {1} {2}", item1, item2, LineBreak);
}
private string GetCookieDetails(HttpRequest request)
{
//Code has been removed for simplicity
}
}
}
此类负责格式化高级错误详细信息,例如主机地址、URL、请求头信息。此类从给定的 HttpRequest
类型对象中提取所有相关信息。
如何使用 AnLogger?
将 AnLogger
添加到 ASP.NET 应用程序只需要三个步骤:
- 获取
AnLogger
二进制文件并将其作为引用添加到 ASP.NET 项目。 - 配置 web.config 文件以添加配置项。
- 从 Global.asax.cs 文件调用其中一个日志记录器(
EmailLogger
或FileLogger
)。
下图显示了使用 AnLogger
的步骤。

从上图可以看出,AnLogger.dll 已添加到 AnLoggerTestHarness
项目中,在 AnLoggerTestHarness
项目的 web.config 中添加了相关的配置项,最后从 Global.asax.cs 文件调用了一个日志记录器(EmailLogger
)来记录 Exception
,通过发送包含异常详细信息的电子邮件。
如果决定使用 FileLogger
,则不需要配置 To、From 和 SmtpServer 配置项,因为所有这些项都与 EmailLogger
功能相关。唯一需要的配置项是 DefaultFilePath
。从 Global.asax.cs 文件使用 FileLogger
如下:
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
FileLogger fileLogger = new FileLogger();
fileLogger.Log(Server.GetLastError(),Request);
}
测试和结果
下图显示了一个使用 AnLogger
记录异常并通过电子邮件将 HTML 格式的异常发送给收件人的 ASP.NET 应用程序。

电子邮件正文包含由在线计算器程序引发并由 AnLogger
处理的 HTML 格式异常。
限制
此版本的 AnLogger
存在以下限制:
- 它不包含任何
HTTPModules
来记录异常。
历史
- 版本 1
- 版本 2