log4net每个连接都有appender

时间:2017-08-30 22:30:35

标签: log4net

编辑:我把它拿回来,我的代码出错了,一​​旦我修好了它就行了。代码现在已更新为工作版本。 错误发生在ThreadContext.Properties[KEY_LOG_FOLDER] = loggerName;和         ThreadContext.Properties[KEY_LOG_FILE] = loggerName;。我不小心将"KEY_LOG_FOLDER""KEY_LOG_FILE"放在引号中,它们应该是其他地方定义的const字符串。

我试图为每个连接设置一个滚动文件追加器。连接动态进入,无法在启动时确定。目前我正在尝试以下方法:

XML:

<log4net>
  <logger name="Connection.CommunicationLogger">
    <appender-ref ref="ConnectionCommunicationFileAppender"/>
    <level value="ALL"/>
  </logger>

  <appender name="ConnectionCommunicationFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\logs\%property{LogFolder}\%property{LogName}.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date:  %message%newline" />
    </layout>
  </appender>
</log4net>

代码:

public FileLogger(string loggerName)
{
    string logsDir = ConfigurationManager.AppSettings["LogRootDirectory"];
    System.IO.Directory.CreateDirectory(logsDir + "\\" + loggerName);

    ILoggerRepository loggerRepository = LogManager.CreateRepository(loggerName + REPOSITORY);

    ThreadContext.Properties[KEY_LOG_FOLDER] = loggerName;
    ThreadContext.Properties[KEY_LOG_FILE] = loggerName; 

    log4net.Config.XmlConfigurator.Configure(loggerRepository);
    logger = LogManager.GetLogger(loggerName + REPOSITORY, "Connection.CommunicationLogger");
}

然而,当它快速执行时,这似乎不起作用。

我应该以编程方式为每个连接创建appender,还是那种不好的做法?

1 个答案:

答案 0 :(得分:2)

我认为文件名只设置一次,所以不是每次都记录。如果你想要不同的文件名,一个选项可以是动态地为每个文件制作不同的记录器,就像你提出的问题一样。