1

我试图弄清楚如何使用 ThreadContext.Properties 设置每个用户的会话。

当用户登录网站时,用户 ID 存储在会话中。然后我想在成功登录后将此值附加到 ThreadContext.Properties["UserID"] 。

我正在使用 adonetappender 将日志条目保存到 db,并使用 %property{userid} 来检索值。但有时这个值读取为空。

所以基本上我想要的是:

1) 创建

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

在我要登录的那些页面上。

2) 成功登录后,我需要在 ThreadContext.Properties["UserID"] 中存储一个在整个用户会话中始终存在的值,并且可以从我登录的页面以及 global_asax 中的 Application_Error(...) 中使用. 无论如何,这个 ThreadContext 的寿命是多少?据我所知,我不能真正使用 GlobalContext。

3)我不想重新分配每个日志语句的值。

希望你能明白我要去哪里。

//丹尼尔

4

1 回答 1

0

在这里查看我的答案:

使用 log4net 捕获用户名

对于一些可能对您有所帮助的想法。一直读到最后,因为最后一个想法可能是最简单的并且可能满足您的需求。

总而言之,我首先建议编写一个自定义 PatternLayoutConverter,HttpContextPatternLayoutConverter,它允许记录存储在 HttpContext 中的值。

在我的回答即将结束时,我提出了一个基于另一篇博客文章(链接在我的原始答案中)的解决方案,该解决方案展示了如何编写一个可以存储在 GlobalDiagnosticContext (或 ThreadDiagnosticContext )中的类。当您告诉 log4net 记录 GlobalDiagnosticContext 参数时,log4net 访问该对象并调用其 ToString 方法。对象本身只是从 HttpContext 中提取一个值。

因此,如果您能够使用 HttpContext 来存储要记录的信息,那么我的链接答案可能对您有用。如果您无法使用 HttpContext 来存储信息,那么我的回答可能没有用。

祝你好运!

于 2012-08-16T15:26:31.177 回答