我的.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
中访问此内容?没有它,我无法通过日志文件来判断哪些代码挂起了应用程序,这是一个过滤的主要工作。
答案 0 :(得分:0)
'log'对象是一个静态变量,尝试在Global.asax Application_Error()中获取它是不正确的。根据线程池中的当前线程,您可能会在其中获得不可预测的值。 一种更安全的方法可以与log.Debug()一起将一些Debug数据插入到HttpContext.Current.Items中。然后,您可以在Application_Error()方法中访问这些项。 Context.Items被认为是线程安全的,建议在这种情况下使用。
答案 1 :(得分:0)
另一种方法是让log4net使用电子邮件附加程序为您发送电子邮件。请参阅此示例:http://sradack.blogspot.co.uk/2007/09/have-log4net-send-email-when-error.html