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

Вот сценарий:
У меня есть несколько «сообщений» (данных), которые нужно обрабатывать параллельно.
В этих параллельных процессах я хотел бы регистрировать некоторые вещи в файле журнала для конкретного сообщения.
Я много чего перепробовал, но мои логи просто путаются.

Я написал небольшой тестовый проект. Давайте посмотрим код:

using System.Collections.Generic;
using System.Threading.Tasks;

namespace ParallelTest
{
    public class MessageController
    {
       public void InitiateProcesses(List<Message> messagesToProces)
       {
          MessageProcessor messageProcessor = new MessageProcessor();
          Parallel.ForEach(messagesToProces, messageProcessor.ProcessMessage);
       }
    }
}

MessageProcessor выглядит следующим образом:

using log4net;

namespace ParallelTest
{
    public class MessageProcessor
    {
        public void ProcessMessage(Message message)
        {
            log4net.ThreadContext.Properties["LogName"] = message.MessageId;
            ILog log = LogManager.GetLogger("CsvLogger");
            log4net.Config.XmlConfigurator.Configure();
            log.Info(string.Format("{0} - {1}", message.MessageId, message.Body));
        }
    }
}

Итак, я использую log4net, и это конфигурация:

<log4net>
  <appender name="CsvAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="c:\Temp\log_%property{LogName}.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="1MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date,%message%newline" />
    </layout>
  </appender>

  <logger additivity="false" name="CsvLogger">
    <level value="ALL"/>
    <appender-ref ref="CsvAppender" />
  </logger>
</log4net>

Лог-файлы созданы, но...

  • Некоторые из них пусты
  • Некоторые из них заполнены правильным протоколированием сообщений
  • Некоторые из них также содержат журналирование других сообщений

Здесь мне не помешала бы помощь :)


person user3309364    schedule 14.02.2014    source источник
comment
Вы смотрели на Создание динамического регистратора? То, что вы хотите сделать, я не верю, что может быть выполнено одним регистратором.   -  person matth    schedule 14.02.2014
comment
Я только что попробовал это, и это выглядит многообещающе! Завтра проведу тесты..   -  person user3309364    schedule 18.02.2014
comment
Действительно забавный кусок кода и классные вещи для работы! Мне все еще интересно, почему я не смог заставить работать оригинальное решение. Log4net дает нам возможность установить свойство в контексте угрозы. Для меня эта функциональность предполагает, что мое исходное решение должно быть возможным... каким-то образом.   -  person user3309364    schedule 18.02.2014