我在ASP.NET MVC应用程序中使用log4net。我想登录数据库并使用带有bufferSize = 10的AdoNetAppender来减少数据库的负载。
我还想捕获一些会话变量,例如用户名。我可以这样做:
%aspnet-session{username}
问题是,当填充缓冲区时,似乎会计算会话值,而不是在记录条目时,因此即使每个日志条目由不同的用户创建,我也会得到10个具有相同用户名的日志条目。 / p>
此问题也会影响计算属性 - 即计算属性在填充缓冲区时进行评估,而不是在记录条目时进行评估。
如果bufferSize = 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>