c# - 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
在控制器级别添加一个效果很好但我更喜欢全局生命周期操作来执行一次
解决方案
我刚刚创建了一个 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 并查看它是否有所作为。
推荐阅读
- python - TypeError:“响应”对象不可下标
- html - 我想使用 CSS 更改类的属性值
- windows - 如何下载和安装 Boost
- python - 如何检测多个屏幕
- cypress - 赛普拉斯如何在页面加载结果与所选内容相同后断言
- c# - C# 如果我需要另一个类中的位图,请使用 Dispose()
- apache - Apache 虚拟主机 -- 如何设置子域以指向游戏服务器
- android - Beacon beacon = new Beacon.Builder () .setId1 (sysid) .setId2 (IdUser) Android Beacon Library 中发布和扫描IdUser时出错
- python - 烧瓶中 URL 中没有 cookie 和 sid 的双向通信
- html - 在 Heroku 上部署时 CSS 无法正确应用