C#开发训练营

第6课:ASP.NET(6)——自定义日志功能和tMsg类

自定义日志功能

虽然在使用Visual Studio进行开发时会有一些调试和跟踪工具,但在应用开发和运行时,可能需要更加具体和详细的跟踪信息;在本书的源代码中,很多资源在捕捉异常后都会使用tLog.E()成员进行异常和错误的记录工具,本节就将讨论tLog类及相关资源的具体实现。

tLog类及相关委托类型定义在/app_code/common/base/tLog.cs文件,如下面的代码。

C#
using System;

public delegate void LogError(Exception ex,long code,string msg);
public delegate void LogInfo(string msg);
public delegate void LogWarning(string msg);

public class tLog
{
    public static LogError E = (Exception ex, long code, string msg) => { };
    public static LogInfo I = (string msg) => { };
    public static LogWarning W = (string msg) => { };
}

代码中首先定义了三个委托类型,分别是:

  • LogError(Exception ex, long code, string msg),其中,参数ex表示异常对象;参数code表示错误代码;msg表示自定义的错误描述。
  • LogWarning(string msg),参数msg为自定义的警告描述。
  • LogInfomation(string msg),参数msg为自定义的信息描述。

tLog类定义为静态类,包含了三个静态成员,分别是E、W和I,定义为相应的委托类型,默认的实现是什么也不做;那么,在应用中如何使用tLog类呢?下面的代码(/app_code/app/tApp.cs),在ASP.NET Web项目中重写了tLog类的E字段。

C#
using System;

public class tApp
{
    // 其它代码...
    public static bool Init()
    {
        tLog.E = (Exception ex, long code, string msg) =>
          {
              string path = 
        tWeb.MapPath(@"/app_data/log/E" + DateTime.Now.GetFileName());
              string[] ln = new string[4];
              ln[0] = ex.Message;
              ln[1] = "------------------------------------------------------";
              ln[2] = code.ToString();
              ln[3] = msg;
              System.IO.File.WriteAllLines(path, ln);
          };
        return true;
    }
    //
    //
    //
}

代码中,对于tLog.E字段,我们通过Lambda语法实现了LogError委托,其中,会将异常对象的Message属性(异常描述)、错误代码和自定义描述文本保存到/app_data/log/目录的文件文件,文件命名以字母E开始,然后是保存日期和时间的数字部分,格式如E2021_10_12_17_39_07_663.txt。

tLog.E字段的重写定义在tApp.Init()方法中,在项目启动时需要调用此方法,在本地应用中可以在Program.cs文件中的Main()方法中调用,在ASP.NET Web项目中,可以通过根目录下Global.asax文件中的Application_Start()方法中调用,这样在ASP.NET Web应用启动时就会执行tApp.Init()方法,如下面的代码。

C#
<%@ Application Language="C#" %>

<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        // 在应用程序启动时运行的代码
        tApp.Init();
    }
    
    // 其它代码
</script>

这样一来,在ASP.NET Web项目,tLog.E字段处理的错误信息就会保存到相应的文本文件中。

实际应用中,可以根据需要重定tLog类中的E、W和I成员,可以将这些日志信息分类保存,如使用W开头的文本文件保存警告日志、使用I开头的文本文件保存信息日志等。此外,也可以通过数据库保存日志信息,以便更加高效地分析和处理日志数据。

tMsg类

除了tLog类用于应用日志处理,在ASP.NET项目中还封装了一些工具,如tMsg类用于生成各类信息的页面元素,定义如下(/app_code/aspnet/base/tMsg.cs)。

C#
public class tMsg
{
    //
    public static string GetError(string msg)
    {
        return @"<div class=""msg_error"">" + msg + "</div>";
    }
    public static string GetInfo(string msg)
    {
        return @"<div class=""msg_info"">" + msg + "</div>";
    }
    public static string GetWarning(string msg)
    {
        return @"<div class=""msg_warning"">" + msg + "</div>";
    }
}

tMsg类中定义了三个方法,分别是:

  • GetError()方法,生成div元素定义的错误消息。
  • GetInfo()方法,生成div元素定义的信息。
  • GetWarning()方法,生成div元素定义的警告消息。

本书示例中会使用Literal控件显示消息,消息的div元素样式定义在/lib/css/common.css文件,在页面中引用此样式文件,各类消息显示的新式如图1。

图1

提示中的图片定义在/lib/img/目录,可以根据需要替换使用。

到这里,我们已经回顾了ASP.NET Web项目开发的基本知识,首先是项目中的基本文件类型和一些特殊的目录;然后了解了一系列的Web控件及其应用特点;接下来,我们自定义了一个树状数据结构,并讨论了如何将这个数据结构绑定到Menu和TreeView控件;是ASP.NET Web项目中的四个常用对象,并通过tWeb类的封装方便在开发中快速使用这些对象的常用功能。最后定义了tMsg类,方便在页面中生成三种类型的消息提示元素。