如何获取来自另一个.aspx页面的Global.asax中的log4net日志信息?

时间:2012-06-02 07:04:16

标签: c# asp.net logging error-handling log4net

我的.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中访问此内容?没有它,我无法通过日志文件来判断哪些代码挂起了应用程序,这是一个过滤的主要工作。

2 个答案:

答案 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