Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个.aspx页面获取Global.asax中的log4net日志信息?_C#_Asp.net_Logging_Error Handling_Log4net - Fatal编程技术网

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

C# 如何从另一个.aspx页面获取Global.asax中的log4net日志信息?,c#,asp.net,logging,error-handling,log4net,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 slee

我有一个.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\u Error()中获取它是不正确的。根据线程池中的当前线程,您可能会在其中获得不可预测的值。 更安全的方法是使用log.Debug()将一些调试数据插入HttpContext.Current.Items。然后,您可以在Application_Error()方法中访问这些项。
上下文。项被认为是线程安全的,建议在此类情况下使用。

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

另一种方法是让log4net使用电子邮件附件为您发送电子邮件。请参阅此示例:

另一种方法是让log4net使用电子邮件附加器为您发送电子邮件。请参阅此示例:

此方法的问题在于,它假定您正在点击
\u logger.Error()
行。在我的例子中,
InternalDoSomethingImportant()
阻塞进程的时间足够长,超过了ASP.NET默认超时时间。除了我不知道我的许多方法调用中的哪一个正在执行该块。在这种情况下,在执行之前,请在httpcontext项中记录操作名称,并将其包含在错误消息中?那么,我不会收到每个日志记录程序消息的电子邮件吗?例如,我会在线程睡眠之前收到一封关于
的电子邮件…
和线程睡眠之后收到
。我的方法是:使用logger。慷慨地调试,以便知道每个线程上发生了什么;在调用长时间运行的操作之前,在HttpContext.Items中存储所需的方法名和任何其他信息(每个线程请求);在全局错误处理程序中,使用logger.error。但是,如果您只希望某些错误发送电子邮件,请为该附件创建一个新的log4net类别,或者在您的全局错误类(global.asax)上使用log4net过滤器。您可以将电子邮件附件设置为level=“error”。为level=“DEBUG”创建单独的appender。此方法的问题在于,它假定您正在点击
\u logger.Error()
行。在我的例子中,
InternalDoSomethingImportant()
阻塞进程的时间足够长,超过了ASP.NET默认超时时间。除了我不知道我的许多方法调用中的哪一个正在执行该块。在这种情况下,在执行之前,请在httpcontext项中记录操作名称,并将其包含在错误消息中?那么,我不会收到每个日志记录程序消息的电子邮件吗?例如,我会在线程睡眠之前收到一封关于
的电子邮件…
和线程睡眠之后收到
。我的方法是:使用logger。慷慨地调试,以便知道每个线程上发生了什么;在调用长时间运行的操作之前,在HttpContext.Items中存储所需的方法名和任何其他信息(每个线程请求);在全局错误处理程序中,使用logger.error。但是,如果您只希望某些错误发送电子邮件,请为该附件创建一个新的log4net类别,或者在您的全局错误类(global.asax)上使用log4net过滤器。您可以将电子邮件附件设置为level=“error”。为level=“DEBUG”创建一个单独的appender。谢谢Tisho。使用
HttpContext.Current.Items
似乎适合我。谢谢Tisho。使用
HttpContext.Current.Items
似乎适合我。