Log4Net C# - 带有动态文件名的appender的多线程日志记录问题

时间:2014-07-15 11:12:16

标签: c# log4net

我有一个应用程序,每个用户都有一个不同的日志文件,每个用户的日志文件的名称由用户的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文件)。

我需要一个解决方案,当每个线程(每个用户都有自己的线程)时,日志记录将是用户的文件,而不是其他文件(可能是因为有多线程和一个线程正在配置之前其他线程写日志)。如果可能的话我需要一个没有锁定的解决方案。

感谢!!!

1 个答案:

答案 0 :(得分:0)

您可能想要查看additivity属性的配置。

<logger name="YourLoggerName" additivity="false">
  <level value="ALL" />
  <appender-ref ref="YourAppenderName" />
</logger>