具有bufferSize> 1的log4net AdoNetAppender和包含" aspnet-session"的模式

时间:2014-05-15 03:03:59

标签: log4net

我在ASP.NET MVC应用程序中使用log4net。我想登录数据库并使用带有bufferSize = 10的AdoNetAppender来减少数据库的负载。

我还想捕获一些会话变量,例如用户名。我可以这样做:

%aspnet-session{username}

问题是,当填充缓冲区时,似乎会计算会话值,而不是在记录条目时,因此即使每个日志条目由不同的用户创建,我也会得到10个具有相同用户名的日志条目。 / p>

此问题也会影响计算属性 - 即计算属性在填充缓冲区时进行评估,而不是在记录条目时进行评估。

如果bufferSize = 1,则不会出现问题,因为每个日志条目都会被同时记录,评估和写入。

有没有办法在记录项目时评估会话变量并缓冲日志条目?

1 个答案:

答案 0 :(得分:1)

Application_PostAcquireRequestState中,通过ThreadContext设置用户名:

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
     // Make sure there's a Session in this request if you need it
     if (Context.Handler is IRequiresSessionState)
     {
         var username = Session["UserName"];
         log4net.ThreadContext.Properties["username"] = username ;
     }
}

然后,在您的配置文件中,您有:

<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%property{username}" />
</layout>