【问题标题】:ServiceStack, requests, thread id's, log4netServiceStack、请求、线程 ID、log4net
【发布时间】:2013-04-12 19:11:47
【问题描述】:
我需要一个选项来使用 log4net 启用深度调试日志记录。我熟悉经典的 ASP.Net 如何处理线程,但我想知道线程如何与 ServiceStack 一起工作。目标是使用 %Thread 在日志中将请求分组。我认为唯一的问题是可能存在线程池,并且 %thread id 将在后续请求中重复使用。
我真正想要的是一个唯一的 ID,我可以向 log4net 公开,这样我就可以在构建报告时将单个请求的整个日志记录分组在一起。
任何人都可以提供一些指导吗?
【问题讨论】:
标签:
asp.net
log4net
servicestack
【解决方案1】:
请参阅concurrency in ServiceStack 上的此页面,即托管在 ASP.NET 中的 ServiceStack 本身不会创建任何新线程,请求只是在处理请求的同一 IIS/Nginx/etc ASP.NET HTTP WebWorker 上处理。线程池和线程实例的最终控制权取决于底层 ASP.NET,但它们共同重用相同的线程来处理不同的请求。
只要您想在单个请求的整个生命周期内共享任何数据,请使用IHttpRequest.Items,例如您可以简单地使用 PreRequestFilters 在start of the request 分配一个 Guid:
this.PreRequestFilters.Add((req, res) => req.Items["ReqId"] => Guid.NewGuid());
这会在请求的整个生命周期内持续,并且IHttpRequest 的相同实例在所有过滤器、服务、视图等中都可用。