Я пробовал искать это в Google и наткнулся на это ТАК вопрос. Хотя отчасти это то, что я хочу, тот факт, что я использую задачи, немного усложняет проблему, как я объясню.
Итак, я разрабатываю программу для помощи пользователям первой линии в создании новых учетных записей и почтовых ящиков Active Directory. У меня есть DataGridView, привязанный к BindingList, который, когда приходит время обрабатывать данные в списке для новых пользователей, используется для создания серии параллельных задач, которые выполняются независимо друг от друга.
Я бы хотел создать по одному файлу журнала для каждого создаваемого пользователя. Я пытаюсь использовать общую конфигурацию в качестве основы для создания файла журнала (т.е. те же ограничения в отношении уровня журнала, приложения и т. Д.), Но используйте поле %property{UserName}
в имени файла журнала, чтобы сообщения журнала, относящиеся к различным создаваемым пользователям, помещаются в их собственные отдельные файлы журнала. Таким образом, если возникают проблемы с созданием конкретной учетной записи, пользователям первой линии (или мне) не нужно копаться в одном гигантском файле журнала в поисках проблемного пользователя.
Используя метод, описанный в приведенном выше вопросе SO, я смог создать параметр в файле log4net.config и, получив доступ к свойству с помощью ThreadContext.Properties["UserName"] = entry.Name.ToLower().Replace(" ", "_");
, я также смог установить значение свойства! Проблема, с которой я столкнулся, заключается в том, что я могу использовать свойство в conversionPattern для приложения, и имя пользователя успешно отображается, но размещение свойства в имени файла приложения просто приводит к созданию файла с именем .\uman_user_tasks_(null).log
. Я попытался вызвать событие в коде программы, чтобы заставить log4net распознать, что свойство изменилось, но это не имеет значения.
Кроме того, я также обеспокоен тем, что, поскольку я использую один объект ILog для регистрации создания нескольких учетных записей пользователей, это неправильный путь, когда я создаю серию Задач, выполняющих один и тот же фрагмент кода. Могу ли я создать своего рода Factory, которая использует конфигурацию приложения, но добавляет имя пользователя в конец файла?
Как лучше всего достичь того, что мне нужно? См. Ниже соответствующий раздел конфигурации приложения log4net, если это помогает.
<appender name="uman_users" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value=".\log\uman_user_tasks_%property{UserName}.log" />
<param name="UserName" type="log4net.Util.PatternString" value="%property{UserName}" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="2MB" />
<staticLogFileName value="false" />
<preserveLogFileNameExtension value="true" />
<datePattern value="_yyyyMMdd" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date (%method) [%level] (user: %property{UserName}) - %message%newline" />
</layout>
</appender>