欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

错误页,记录错误日志

程序员文章站 2024-02-22 15:59:16
...

我们一般网站一定会出现错误,而且我们要把错误记录下来,然后在处理,然后会有一个专门的错误页,或者是跳转到主页面。

第一种是在配置文件中Web.config

<customErrors mode ="On" defaultRedirect ="Defalt.aspx">
      </customErrors>

第二种就是在Global.asax文件中Application_Error事件中写,下面多说点:

多个错误都访问这个事件的时候,会出现多线程的问题,解决这个问题,我们可以为操作日志文件加锁。然后遇到了另一个问题,就是操作量大,所有人都在等待错误消息。解决办法,先把错误消息写到内存队列,当前请求立马返回,不用等待。第三个问题,如何把队列里的错误消息写到日志文件中,启用新的线程,不断写到日志文件中。

添加一个类,拿到队列里的错误,写到日志

 public class LogHelper
    {
        public static Queue<string> ExcpetionInoQeue = new Queue<string>();
        public static string logbasepath;
        static LogHelper()
        {
            ThreadPool.QueueUserWorkItem(o =>
           {
               while (true)
               {
                  
                       if (ExcpetionInoQeue.Count > 0)
                       {
                           string str = ExcpetionInoQeue.Dequeue();
                           string strFileName =DateTime.Now.ToString(@"yyyy-MM-dd") + ".txt";
                       string absoluteFileName = Path.Combine(logbasepath ,strFileName ); 

                           using (FileStream fs = new FileStream(absoluteFileName, FileMode.Append, FileAccess.Write))
                           {

                               byte[] data = Encoding.Default.GetBytes(str);
                               fs.Write(data, 0, data.Length);
                           }

                       }
                   
               }
           });
        }
    }

下面是 Global.asax文件里的Application_Error事件代码

       protected void Application_Error(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(ThreeLayerWebDem.LogHelper.logbasepath))
            {
                ThreeLayerWebDem.LogHelper.logbasepath = Request.MapPath("/Log/");
            }
            ThreeLayerWebDem.LogHelper.ExcpetionInoQeue.Enqueue(Server.GetLastError().ToString());
            Response.Redirect("cookie.aspx");
          

        }

最后,还有问题,就是我们的日志文件,会写到好多个地方,可以加一个观察者模式。

相关标签: asp.net