首页 > 解决方案 > Log4net - 将 LogicalThreadContext 添加到 .NET WebAPI 项目中的每个请求

问题描述

我想为我的项目中的LogicalThreadContext每个请求添加一个。WebAPI

我已将以下代码添加到我的Global.asax

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        log4net.LogicalThreadContext.Properties["context"] = Guid.NewGuid().ToString("N");
    }

但由于某种原因,它不起作用(即使线程 id 没有改变)。

我还尝试ActionFilter在控制器级别添加一个效果很好但我更喜欢全局生命周期操作来执行一次

标签: c#log4net

解决方案


我刚刚创建了一个 ASP.NET 应用程序并将其添加到 global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
        String ipAddress = System.Web.HttpContext.Current.Request.UserHostAddress;
        LogicalThreadContext.Properties["ipAddress"] = ipAddress;
        log.Info("Application_BeginRequest");
}

protected void Application_EndRequest(object sender, EventArgs e)
{
        log.Info("Application_EndRequest");
}

在 log4net 的配置中,我添加%property{ipAddress}了将用户的 IP 地址打印到日志文件。我的附加程序的配置是:

<appender name="RollingFile" type="log4net.Appender.FileAppender">
  <file value="c:\temp\example.log" />
  <appendToFile value="true" />
  <maximumFileSize value="100KB" />
  <maxSizeRollBackups value="2" />

  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%property{ipAddress} - %message%newline" />
  </layout>
</appender>

如果我浏览到我的 Web 应用程序的页面,我可以在 c:\temp\example.log 中看到以下内容:

::1 - Application_BeginRequest
::1 - Application_EndRequest

我能想到为什么它在你的情况下不起作用的唯一原因是我在这里找到的这句话:

逻辑线程上下文在每个 CallContext 的基础上进行管理。CallContext 需要基础结构的链接时间 SecurityPermission。如果调用代码没有此权限,则此上下文将被禁用。它不会在其上存储任何设置 > 的属性值。

这意味着,如果您没有link time SecurityPermission,那么您的代码正在运行。尝试将 LogicalThreadContext 更改为 ThreadContext 并查看它是否有所作为。


推荐阅读