gpt4 book ai didi

c# - 每个请求的 log4net.GlobalContext.Properties 是否不同?

转载 作者:太空狗 更新时间:2023-10-29 22:12:01 24 4
gpt4 key购买 nike

在 log4net 中,我想将请求 ID 附加到特定 http 请求的每个日志语句。请求 ID 在多个请求中是不同的。在我的 global.asax.cs 中,我分配了一个 requestId。

   protected void Application_BeginRequest(object sender, EventArgs e)
{

log4net.GlobalContext.Properties["requestId"] =
System.Guid.NewGuid().ToString();
log.Info("Starting request.");
}

在我的 Log4Net.config 中,我将 requestId 添加到我的模式布局中:

<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%property{requestId} %d [%t] %-5p %c %m%n"/>
</layout>

使用 GlobalContext 设置变量的方法是线程安全的吗?我是否有并发 http 请求的风险不安全地更改 requestId 以记录另一个请求?

如果这是不安全的,什么是安全的实现方式?

最佳答案

不,这是不正确的;全局上下文在所有线程和域之间共享。在 GlobalContext 上设置相同属性的两个线程将覆盖彼此的属性。 log4net.GlobalContext.Properties["requestId"] 将始终包含最近启动的请求的请求 ID。

存在threadsafe并不意味着线程无关:它意味着对象可以同时被多个线程操作。

使用每个线程都存在的 ThreadContext 并让您拥有每个线程的属性(因此每个请求,假设您的线程在某个时候没有将工作委托(delegate)给另一个线程):log4net.ThreadContext.Properties["requestId"]

关于c# - 每个请求的 log4net.GlobalContext.Properties 是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26644635/

24 4 0
文章推荐: c# - 在 ASP.NET C# SQL 中导致问题的文本框
文章推荐: python - ProgrammingError : (1146, "Table ' test_.' doesn' t exist") 为 Django 运行单元测试时
文章推荐: c# - C#中的IF实现