我有一个 .aspx 页面,其中包含一些需要很长时间执行并触发请求超时的同步代码。例如:
protected void Page_Load(object sender, EventArgs e)
{
var log = LogManager.GetLogger("test");
log.Debug("Before thread sleep...");
Thread.Sleep(99999999);
log.Debug("After thread sleep.");
}
在我的 Global.asax
中,我添加了一些错误处理,可以通过电子邮件发送任何异常:
protected void Application_Error(Object sender, EventArgs e)
{
var exception = HttpContext.Current.Server.GetLastError();
SendExceptionEmail(exception);
}
问题是,在 Global.asax
中,我只能访问请求和响应以及发生的异常,但不能访问记录器的输出。我如何在 Global.asax
中访问它?没有它,我无法在不挖掘日志文件的情况下判断是哪段代码挂起了应用程序,这是一项需要过滤的主要工作。
'log' 对象是一个静态变量,尝试在 Global.asax Application_Error() 中获取它是不正确的。根据线程池中的当前线程,您可能会在其中获得不可预测的值。一种更安全的方法可以与 log.Debug() 一起将一些调试数据插入到 HttpContext.Current.Items 中。然后您可以在 Application_Error() 方法中访问这些项目。Context.Items 被认为是线程安全的,建议在这种情况下使用。
我是一名优秀的程序员,十分优秀!