- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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/
我是一名优秀的程序员,十分优秀!