Вот сценарий:
У меня есть несколько «сообщений» (данных), которые нужно обрабатывать параллельно.
В этих параллельных процессах я хотел бы регистрировать некоторые вещи в файле журнала для конкретного сообщения.
Я много чего перепробовал, но мои логи просто путаются.
Я написал небольшой тестовый проект. Давайте посмотрим код:
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>
Лог-файлы созданы, но...
- Некоторые из них пусты
- Некоторые из них заполнены правильным протоколированием сообщений
- Некоторые из них также содержат журналирование других сообщений
Здесь мне не помешала бы помощь :)