2013-06-03 3 views
1

Я пытаюсь писать лог-файл для каждого пользователя отдельносвойства Log4Net является перезапись для одновременных запросов

Для этого я устанавливаю свойство имени файла в качестве текущего идентификатора пользователя и настройки log4net как этот

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

Все это хорошо работает, он создает новый файл журнала для каждого пользователя и регистрирует все действия пользователя в отдельных файлах.

Проблема начинается, когда несколько пользователей запрашивают услугу одновременно, а затем начинает вставлять часть журналов одного пользователя в другой файл пользователей, поэтому все журналы смешиваются в файлах одновременных пользователей.

Я получаю причину, что глобальные настройки становятся переопределенными пользователем2, в то время как пользователь1 выполняется, поэтому user1 начинает записывать журналы в файл user2, поскольку настройки теперь переопределены.

Я пробовал log4net.LogicalThreadContext и log4net.ThreadContext также, но они также не работали.

Есть ли обходной путь для этого?

+0

См. Http://piers7.blogspot.co.uk/2005/12/log4net-context-problems-with-aspnet.html – sgmoore

ответ

0

Log4net имеет только одну конфигурацию. Поэтому вы не можете исправить это, получив другую конфигурацию для каждого пользователя. Однако вы можете зарегистрировать имя пользователя или создать регистратор, названный в честь вашего пользователя. Затем вы можете создавать разные приложения для каждого пользователя и записывать выходные данные в разные файлы. И вам нужно только позвонить 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> 
.... 
Смежные вопросы