Как использовать присваивание свойства log4net для создания отдельных файлов журнала для одной (или нескольких) задач, выполняющихся одновременно? - PullRequest
1 голос
/ 27 сентября 2019

Я попытался найти это в 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>

1 Ответ

0 голосов
/ 27 сентября 2019

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

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

...