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

本文关键字:aspx log4net 信息 记录 日志 另一个 Global asax 获取 | 更新日期: 2023-09-27 18:36:01

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

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

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

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