天天看点

ASP.NET - ASP.NET错误日志写入

当我们一个web项目开发已完成,测试也通过了后,就把他放到网上去,但是,bug是测不完的,特别是在一个大的网络环境下。那么,我们就应该记录这些错误,然后改正。这里,我的出错管理页面是在global.asax里面的,因为里面有一个Application_Error函数,我觉得这个就是管理错误的。其实,asp.net里还有一个方法,就是在 page 里指定出错的页面,由这个页面专门管理,我觉得这个方法也好,但是每次都要到相应的page里指定参数,不过,我觉得应该可以在web.config里配置吧。但是我还是喜欢下面的方法。下面我们就开始吧。

Global.asax代码:

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

<script runat="server">

        void Application_Start(object sender, EventArgs e)    

        {

                // 在应用程序启动时运行的代码

        }

        void Application_End(object sender, EventArgs e)    

                //    在应用程序关闭时运行的代码

        void Application_Error(object sender, EventArgs e)    

        {    

                // 在出现未处理的错误时运行的代码

                        Exception objErr = Server.GetLastError().GetBaseException();

                        string error = string.Empty;

                        string errortime = string.Empty;

                        string erroraddr = string.Empty;

                        string errorinfo = string.Empty;

                        string errorsource = string.Empty;

                        string errortrace = string.Empty;

                        error += "发生时间:" + System.DateTime.Now.ToString() + "<br>";

                        errortime = "发生时间:" + System.DateTime.Now.ToString();

                        error += "发生异常页: " + Request.Url.ToString() + "<br>";

                        erroraddr = "发生异常页: " + Request.Url.ToString();

                        error += "异常信息: " + objErr.Message + "<br>";

                        errorinfo = "异常信息: " + objErr.Message;

                        //error +="错误源:"+objErr.Source+"<br>";

                        //error += "堆栈信息:" + objErr.StackTrace + "<br>";

                        errorsource = "错误源:" + objErr.Source;

                        errortrace = "堆栈信息:" + objErr.StackTrace;

                        error += "--------------------------------------<br>";

                        Server.ClearError();

                        Application["error"] = error;

                        //独占方式,因为文件只能由一个进程写入.

                     System.IO.StreamWriter writer=null;

                        try

                        {                                

                                lock (this)

                                {

                                        // 写入日志

                                        string year = DateTime.Now.Year.ToString();

                                        string month = DateTime.Now.Month.ToString();

                                        string path = string.Empty;

                                        string filename = DateTime.Now.Day.ToString() + ".txt";

                                        path = Server.MapPath("~/Error/") + year + "/" + month;

                                        //如果目录不存在则创建

                                        if (!System.IO.Directory.Exists(path))

                                        {

                                                System.IO.Directory.CreateDirectory(path);

                                        }

                                        System.IO.FileInfo file = new System.IO.FileInfo(path + "/" + filename);

                                        //if (!file.Exists)

                                        //        file.Create();

                                        //file.Open(System.IO.FileMode.Append);                

                                        writer = new System.IO.StreamWriter(file.FullName, true);//文件不存在就创建,true表示追加

                                        writer.WriteLine("用户IP:" + Request.UserHostAddress);

                                        //if (Session["UserName"] != null)

                                        //{

                                        //        writer.WriteLine("用户名" + System.Web.HttpContext.Current.Session["UserName"].ToString());

                                        //}

                                        writer.WriteLine(errortime);

                                        writer.WriteLine(erroraddr);

                                        writer.WriteLine(errorinfo);

                                        writer.WriteLine(errorsource);

                                        writer.WriteLine(errortrace);

                                        writer.WriteLine("--------------------------------------------------------------------------------------");

                                        //writer.Close();

                                }

                        }

                        finally    

                        {

                                if (writer != null)

                                        writer.Close();

                        }        

                        Response.Redirect("~/Error/ErrorPage.aspx");

        void Session_Start(object sender, EventArgs e)    

                // 在新会话启动时运行的代码

                Session.Timeout = 60;                

                if (Session.IsNewSession)

                {

                        lock (this)

                                if (Application["Counts"] != null)

                                        Application["Counts"] = Int32.Parse(Application["Counts"].ToString()) + 1;

                                else

                                        Application["Counts"] = 1;

                }

        void Session_End(object sender, EventArgs e)    

                // 在会话结束时运行的代码。    

                // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为

                // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer    

                // 或 SQLServer,则不会引发该事件。

                if (Application["Counts"] != null)

                        Application["Counts"] = Int32.Parse(Application["Counts"].ToString())-1;

                }                

</script>

显示出错信息的页面

ErrorPage.aspx代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ErrorPage.aspx.cs" Inherits="Error_ErrorPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

        <title>出错信息</title>

        <link href="css/SITE.CSS" type="text/css" rel="stylesheet" />        

</head>

<body>

        <form id="form1" runat="server">

                <asp:Label ID="Label1" runat="server" Width="568px"></asp:Label>

        </form>

</body>

</html>

ErrorPage.aspx.cs

protected void Page_Load(object sender, EventArgs e)

                this.Label1.Text = Application["Error"].ToString();