错误页,记录错误日志
程序员文章站
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");
}
最后,还有问题,就是我们的日志文件,会写到好多个地方,可以加一个观察者模式。