2

我有一个 .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?没有它,如果不挖掘日志文件,我就无法判断是哪段代码挂起了应用程序,这是过滤的一项主要工作。

4

2 回答 2

0

“日志”对象是一个静态变量,尝试在 Global.asax Application_Error() 中获取它是不正确的。根据线程池中的当前线程,您可能会在其中获得不可预测的值。更安全的方法可能是与 log.Debug() 一起将一些 Debug 数据插入 HttpContext.Current.Items。然后您可以在 Application_Error() 方法中访问这些项目。Context.Items 被认为是线程安全的,建议在这种情况下使用。

于 2012-06-02T11:52:07.097 回答
0

另一种方法是让 log4net 使用电子邮件附加程序为您发送电子邮件。请参阅此示例:http ://sradack.blogspot.co.uk/2007/09/have-log4net-send-email-when-error.html

于 2012-06-02T12:00:18.187 回答