首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置特定于ASP.NET请求的log4net上下文属性?

如何设置特定于ASP.NET请求的log4net上下文属性?
EN

Stack Overflow用户
提问于 2012-03-14 20:33:37
回答 3查看 10.9K关注 0票数 10

我一直使用log4net来记录我们的ASP.NET网站的日志消息,最近我想添加有关发生错误的页面/处理程序的信息。因此,我决定将以下行添加到Global.asax:

代码语言:javascript
运行
复制
void Application_BeginRequest(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["page"] = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
}

和wise一样,我将%property{page}添加到我的转换模式中:

代码语言:javascript
运行
复制
<conversionPattern value="%newline%date %-5level %property{page} - %message%newline%newline%newline" />

这对于单个请求很好地工作。但是后来我在日志中注意到,在ASP.NET请求期间,页面属性可能会发生变化。我在一个ASHX处理程序中进行了日志记录,在其处理过程中,页面属性将更改为另一个指向ASPX页面的值。我的结论是,有另一个请求进入ASP.NET,它的BeginRequest被执行,log4net.ThreadContext中的静态页面属性被更改为另一个值。

现在,我想维护每个请求的页面属性,这样我就可以将正在执行的页面的路径一致地记录到日志中。我试着寻找答案,但一无所获。解决此问题的推荐方法是什么?我确信这是web服务器事件日志的非常基本的功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-20 23:22:08

由于整个页面请求将在同一线程上处理,因此我更喜欢从HttpContext.Current as log4net processes as log4net processes logging事件中获得答案。

下面的GetCurrentPage类通过重写其ToString方法来实现log4net手册中所称的"Active Property Value"

代码语言:javascript
运行
复制
public class GetCurrentPage
{
  public override string ToString()
  {
      if (null != HttpContext.Current)
      {
          return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
      }
      return string.Empty; // or "[No Page]" if you prefer
  }
}

在log4net的GlobalContext中的Global.asax的Application_Start中注册此类。

代码语言:javascript
运行
复制
protected void Application_Start(object sender, EventArgs e)
{
    XmlConfigurator.Configure();
    GlobalContext.Properties["page"] = new GetCurrentPage();
}

当log4net编写行的%property{page}部分时,它将调用GetCurrentPage类的ToString方法,该方法将查找当前请求中的值。

票数 23
EN

Stack Overflow用户

发布于 2012-03-15 00:07:57

您是否尝试过使用Application_PostAcquireRequestState而不是本文中列出的Application_BeginRequest?How can I include SessionID in log files using log4net in ASP.NET?

我们从来没有觉得有必要将页面添加到日志记录中,因为我们在每个类中使用方法名创建了我们的记录器:

代码语言:javascript
运行
复制
private static new readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

并且有一个这样的转换模式:

代码语言:javascript
运行
复制
<conversionPattern value="%date %P{user} %P{addr} [%property{SessionID}] %level %logger - %message%newline" />

因此,我们最终在日志输出中看到了类名。这还允许您区分日志记录是否发生在页面类文件本身中,还是发生在它继承的基类中。即使代码在基类中执行,您的解决方案也具有显示页面名称的优势。我认为我们将考虑将{page}添加到我们的设置中。

票数 2
EN

Stack Overflow用户

发布于 2018-02-14 17:28:41

将属性值存储在ASP.NET context HttpContext.Current.Items.Add("yourProperty", value)中它将从log4net layout中获得:

代码语言:javascript
运行
复制
<layout type="log4net.Layout.PatternLayout">
   <conversionPattern value="%aspnet-context{yourProperty}" />
</layout>

查找更多详细信息here.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9702066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档