log4net %属性 设置后为空

log4net %property gets null after being set

我已将 log4Net ADONetAppender 设置为 table 称为 log。

log4net 在 Global.asax.cs 文件的 Application_Start() 上配置。

table 及其插页是典型的

INSERT INTO log ([PCDate],[Thread],[Level],[Logger],[Message],[Exception]) 
    VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)

不同之处在于我将我的记录器设置为当前登录系统的应用程序用户。

这在 .config 文件中。

<parameter>
   <parameterName value="@logger"/>
   <dbType value="String"/>
   <size value="255"/>
   <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%property{userName}"/> 
   </layout>
</parameter>

我在 class 负责处理的用户数据记录的任何插入、更新或删除之前进行日志记录。

logger.Info(strquery); 

记录器的消息,是insert/update或删除查询。 记录器设置为当前应用程序记录的用户,例如鲍勃,阿什等 在登录和调试时验证它是否设置为该值。

log4net.ThreadContext.Properties["userName"] = userName;

我也可以将上述语句放在最终将执行 insert/add/delete 的每个 asp 中,但这很麻烦,我们查看 12 个当前文件,更不用说这是不可扩展的。

Where/why 属性 值在 ??
之后是否设置为 null table 条记录看起来像这样

发生这种情况是因为 ThreadContext 将用户名 保留在当前线程 上,并且正如您从日志中看到的那样,线程在调用之间发生变化:当您设置登录时的值,它对当前请求有效,但下一个请求得到一个新线程,因此一个新的 ThreadContext 并且值消失了。

如果您在会话中存储用户名,则可以在 Global.asax.cs 文件的 Application_AcquireRequestState 事件中设置 ThreadContext 属性。然后它将对整个请求有效。