2015-11-11 85 views
0

我将log4Net ADONetAppender设置为一个名为log的表。log4net%属性在设置后变为空

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

表和它的刀片是典型

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> 

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

logger.Info(strquery); 

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

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

我也可以把上面的语句在每个ASP,最终会做插入/添加/删除,但将是十分繁琐,我们看12当前文件更何况,这是无法形成规模,能。

何处/为什么属性值设置为null后?
表中的记录是这样的

enter image description here

回答

0

发生这种情况,因为ThreadContext坚持当前线程上的用户名,并且你可以从你的日志中看到调用之间的线程的变化:当您设置登录时的值,它对当前请求有效,但下一个请求将获得一个新线程,并因此产生一个新的ThreadContext,并且该值已消失。

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

+0

伟大的一点。但是,只有在login.aspx页面上单击登录按钮后,才会设置该用户名。我还不知道application_beginRequest的价值。或者我需要通过将它保存在会话中并在BeginREquest中检查它来检查它吗? – devsahem

+0

斯图尔特,我用了GlobalContext。记录器的值持续不为空:) :)但是,我不确定是否全局跨所有用户? [链接](https://logging.apache.org/log4net/release/manual/contexts.html)该链接描述了跨AppDomain(我不明白)如何使用globalcontext。这是否意味着它会影响其他用户,并且每个最近记录的用户都会覆盖此值?我需要另一台机器来测试它。 – devsahem

+0

是的,GlobalContext将只保存一个值,即最后一个登录用户的值。您之前在会话中保留用户名并使用它填充ThreadContext的想法仍然有效。 – stuartd