C # - Как использовать присвоение свойств log4net для создания отдельных файлов журнала для одной (или нескольких) задач, выполняемых одновременно?

Я пробовал искать это в 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>

person Fredulom    schedule 27.09.2019    source источник


Ответы (1)


Мне удалось найти еще один вопрос SO, который, к счастью, решил проблему, с которой я столкнулся. В результате вместо статической ссылки на регистратор, настроенный в файле log4net.config, я вместо этого использовал этот метод динамического создания объектов Appender и Logger перед их регистрацией в LogManager.

Для всех, кого это интересует, я также обращаюсь к управлению памятью, освобождая Appenders, привязанные к этим объектам Logger, после использования методами, описанными в этом сообщении.

person Fredulom    schedule 27.09.2019