Log4Net属性将覆盖同时发出的请求

时间:2013-06-03 13:37:48

标签: asp.net-mvc-3 logging log4net

我正在尝试单独为每个用户编写日志文件

为此,我将文件名的属性设置为当前用户ID并像这样配置log4net

log4net.GlobalContext.Properties["userid"] = userId; 
log4net.Config.XmlConfigurator.Configure();

这一切都运行良好,它为每个用户创建新的日志文件,并将用户的所有活动记录在各自的文件中。

问题在多个用户同时请求服务时启动,然后开始将一个用户的部分日志放到另一个用户文件中,因此所有日志都会在同时用户文件中混淆。

我得到的结果是,当user1正在进行时,user2会覆盖全局设置,因此user1开始将日志写入user2的文件,因为现在已覆盖设置。

我也尝试了log4net.LogicalThreadContextlog4net.ThreadContext,但它们也没有用。

有没有解决方法呢?

1 个答案:

答案 0 :(得分:0)

Log4net只有一个配置。因此,您无法通过为每个用户获取不同的配置来解决此问题。但是,您可以记录用户名,或创建以用户命名的记录器。然后,您可以为每个用户创建不同的appender,并将输出记录到不同的文件。而且您只需拨打log4net.Config.XmlConfigurator.Configure();一次。

string userid = (...) ;
ILog log = LogManager.GetLogger(userId);


<log4net>
<appender name="<userid1>" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
  ....
</appender>
<appender name="<userid2>" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
  ....
</appender>
<logger name="<userid1>">
  <level value="ALL"/>
  <appender-ref ref="<userid1>"/>          
</logger>
<logger name="<userid2>">
  <level value="ALL"/>
  <appender-ref ref="<userid2>"/>          
</logger>
....