• 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();
        }
  • 相关阅读:
    2006: [NOI2010]超级钢琴
    3640: JC的小苹果
    2005: [Noi2010]能量采集
    金蝶云星空修改密码策略的SQL脚本
    关于 springboot 过滤器中使用@Autowired 为空 以及 使用 @Value 无法读取yml配置的问题解决
    CAS .NET Client 循环重定向的解决办法
    K/3 Cloud SSO配置
    K/3 Cloud SSO配置答疑
    K/3 Cloud 元数据表
    AngularJS select中ngOptions用法详解【转】
  • 原文地址:https://www.cnblogs.com/ringwang/p/992023.html
Copyright © 2020-2023  润新知