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

AnLogger - ASP.NET 日志记录器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (10投票s)

2011 年 10 月 9 日

CPOL

5分钟阅读

viewsIcon

70431

downloadIcon

1637

通过电子邮件轻松快速地记录 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 是一个轻量级库。它目前包含以下类来记录异常详细信息:

ClassDiagram_AnLogger.png

图 1: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" />
图 2:AnLogger 使用的配置项说明

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 的步骤。

Usage_Of_AnLogger_V2.png
图 3:如何在 Asp.Net 应用程序中使用 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 应用程序。

TestHarnessAtRuntime.png

Email_Output.png

图 4:AnLogger 的测试用法

电子邮件正文包含由在线计算器程序引发并由 AnLogger 处理的 HTML 格式异常。

限制

此版本的 AnLogger 存在以下限制:

  • 它不包含任何 HTTPModules 来记录异常。

历史

  • 版本 1
  • 版本 2
© . All rights reserved.