Я попытался найти это в Google и наткнулся на этот ТАК вопрос.Хотя это отчасти то, что я хочу, тот факт, что я использую задачи, немного усложняет проблему, как я объясню.
Итак, я разрабатываю программу, которая поможет пользователям первой линии создаватьновые учетные записи Active Directory и почтовые ящики.У меня есть DataGridView, связанный с BindingList, который, когда придет время обрабатывать данные в списке, для новых пользователей, используется для создания серии параллельных задач, которые выполняются независимо друг от друга.
Что бы я хотелкак сделать, это создать один файл журнала для каждого создаваемого пользователя.То, что я пытаюсь сделать, это использовать общую конфигурацию в качестве основы для создания файла журнала (то есть те же ограничения в отношении уровня журнала, appender и т. Д.), Но использовать поле %property{UserName}
в имени журналаТаким образом, сообщения журнала, относящиеся к различным создаваемым пользователям, помещаются в их собственные отдельные файлы журнала.Таким образом, если возникают проблемы с созданием определенной учетной записи пользователя, пользователям первой линии (или мне) не нужно копаться в одном гигантском файле журнала в поисках проблемного пользователя.
ИспользованиеМетод, описанный в приведенном выше вопросе SO, я смог создать параметр в файле log4net.config и, получив доступ к свойству с помощью ThreadContext.Properties["UserName"] = entry.Name.ToLower().Replace(" ", "_");
, смог установить значение свойства тоже!Проблема, с которой я сталкиваюсь, заключается в том, что я могу использовать свойство в ConversionPattern для приложения, и имя пользователя успешно отображается, но добавление свойства в имя файла приложения позволяет просто создать файл с именем .\uman_user_tasks_(null).log
.Я попытался вызвать событие в коде программы, чтобы log4net распознал, что свойство изменилось, но это не имеет значения.
Кроме того, я также обеспокоен тем, что, поскольку я использую одинILog объект для регистрации создания нескольких учетных записей пользователей не является правильным способом, когда я создаю серию задач, выполняющих один и тот же кусок кода.Могу ли я создать своего рода Фабрику, которая использует конфигурацию приложения, но добавляет имя пользователя в конец файла?
Каков наилучший способ добиться того, чего я добиваюсь?См. Ниже соответствующий раздел конфигурации приложения 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>