log4net%属性在设置后变为null

时间:2015-11-11 12:26:30

标签: c# asp.net logging log4net

我已将log4Net ADONetAppender设置为名为log的表。

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

表格及其插页是典型的

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

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

这在.config文件中。

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

我在负责处理它的类中插入,更新或删除用户数据记录之前进行日志记录。

logger.Info(strquery); 

记录器的消息是插入/更新或删除查询。 记录器被设置为当前应用程序记录的用户,例如鲍勃,灰等 登录和调试验证它是否设置为该值。

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

我可以选择在最终进行插入/添加/删除的每个asp中加上上述语句,但是我们在查看12个当前文件时很麻烦,更不用说这是不可扩展的了。

where / why为什么在??之后将属性值设置为null 表记录看起来像这样

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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