我有一个应用程序,每个用户都有一个不同的日志文件,每个用户的日志文件的名称由用户的ID设置。 我有一个appender,它的名称是由线程上下文属性动态的:
配置文件:
<appender name="WebClient" type="log4net.Appender.RollingFileAppender">
<File type="log4net.Util.PatternString" value="C:\\Log\\%property{UserID}.log"/>
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Size" />
<param name="MaximumFileSize" value="2500KB" />
<param name="MaxSizeRollBackups" value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ClientLogDate} [%4t] %5p %m %n" />
</layout>
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="WebClient" />
<acceptOnMatch value="true" />
</filter>
</appender>
在C#函数中:
ThreadContext.Properties["ClientLogDate"] = DateTime.Now;
ThreadContext.Properties["UserID"] = p_strUserID;
XmlConfigurator.Configure();
ILog Logger = LogManager.GetLogger(WebClientLogger");
Logger.Error(p_strMessage);
问题是当两个或多个用户同时登录时,每次写入日志时都会调用该函数,设置用户ID,appender由新日志文件的名称配置(用户ID) )。 如果有两个用户(一个ID为1234,第二个ID为5678)并且他们都同时登录,则创建了两个日志文件:
1234.log
5678.log
但是当查看日志文件时,似乎用户不会仅将日志写入其文件(例如,ID为1234的用户有时会写入5678.log文件)。
我需要一个解决方案,当每个线程(每个用户都有自己的线程)时,日志记录将是用户的文件,而不是其他文件(可能是因为有多线程和一个线程正在配置之前其他线程写日志)。如果可能的话我需要一个没有锁定的解决方案。
感谢!!!
答案 0 :(得分:0)
您可能想要查看additivity属性的配置。
<logger name="YourLoggerName" additivity="false">
<level value="ALL" />
<appender-ref ref="YourAppenderName" />
</logger>