Написание средств ведения журнала с поддержкой многопроцессорности
Функция MSBuild поддержка нескольких процессоров позволяет сократить время построения проекта, но усложняет ведение журнала событий построения. В среде с одним процессором события, сообщения, предупреждения и ошибки поступают в средство ведения журнала последовательно и вполне предсказуемо. Но в многопроцессорной среде события из различных источников могут поступать одновременно или не по порядку. Для обеспечения работы этого решения в приложении MSBuild предоставляет ведение журнала и новая модель ведения журнала, и позволяет создавать пользовательские средства ведения журнала «препровождения».
Основные проблемы ведения журналов в многопроцессорной среде
Если выполняется построение одного или нескольких проектов в многопроцессорной или многоядерной системе, в MSBuild одновременно создаются события построения для всех проектов. Множество сообщений о событиях может поступать в средство ведения журнала одновременно или не по порядку. Поскольку средство ведения журнала MSBuild 2.0 не предназначено для обработки этой ситуации, может произойти переполнение средства ведения журнала, что повлечет за собой увеличение времени построения, появление неверных выходных данных в средстве ведения журнала или даже повреждение построения. Для устранения этих проблем ведение журнала (3.5), в MSBuild может процесс события выхода последовательности и события коррелата и их источников.
Чтобы повысить эффективность функции ведения журнала, создайте пользовательское средство ведения журнала переадресации. Созданное пользователем средство ведения журнала переадресации действует как фильтр, позволяя выбрать перед построением только те события, за которыми нужно вести наблюдение. Благодаря пользовательскому средству ведения журнала переадресации можно предотвратить переполнение средства ведения журнала ненужными событиями, загромождение журналов или замедление построения.
Модели ведения журналов в многопроцессорной среде
Для обеспечения работы решения проблем построения MSBuild поддерживает 2 модели — централизованную и диаграммы.
Централизованная модель ведения журнала
В централизованной модели ведения журнала основной экземпляр MSBuild.exe действует как "центральный узел", а дочерние экземпляры центрального узла ("дополнительные узлы") подключаются к центральному узлу, чтобы оказать помощь в выполнении задач построения.
Средства ведения журнала различного типа, подключаемые к центральному узлу, называются "центральными средствами ведения журнала". Только один экземпляр средства ведения журнала каждого типа можно подключить к центральному узлу в одно время.
В процессе построения дополнительные узлы перенаправляют события построения в центральный узел. Центральный узел перенаправляет все свои события, а также события дополнительных узлов, в одно или несколько подключенных центральных средств ведения журнала. В средствах ведения журнала создаются файлы журнала на основе входящих данных.
Несмотря на то, что центральным средством ведения журнала должна быть реализована только задача ILogger, рекомендуется также реализовать задачу INodeLogger для инициализации центрального средства ведения журнала с учетом числа узлов, участвующих в построении. При инициализации средства ведения журнала в системе вызывается следующая перегрузка метода Initialize:
public interface INodeLogger: ILogger
{
public void Initialize(IEventSource eventSource, int nodeCount);
}
Все предшествующие средства ведения журнала, поддерживающие ILogger, могут работать в качестве центральных средств ведения журнала и подключаться к построению. Однако центральные средства ведения журнала, созданные без явной поддержки сценариев ведения журнала в многопроцессорной среде и непоследовательных событий, могут привести к прерыванию построения или появлению бессмысленных выходных данных.
Распределенная модель ведения журнала
В централизованной модели ведения журнала слишком большой трафик входящих сообщений может вызывать переполнение центрального узла, например, когда одновременно выполняется построение множества проектов. При этом может увеличиться нагрузка на системные ресурсы и снизиться производительность построения. Чтобы облегчить эту проблему, MSBuild поддерживает распределенной модели ведения журнала.
Распределенная модель ведения журнала расширяет централизованную модель, позволяя создавать средства ведения журнала переадресации.
Средства ведения журнала переадресации
Средство ведения журнала переадресации — это дополнительный, облегченный вариант средства ведения журнала, содержащий фильтр событий, который подключается к дополнительному узлу и принимает входящие события построения от этого узла. В этом средстве выполняется фильтрация входящих событий и переадресация в центральный узел только тех из них, которые представляют интерес для пользователя. В результате уменьшается трафик сообщений, отправляемых в центральный узел, и повышается общая производительность построения.
Существует два способа использования модели распределенного ведения журнала, а именно:
Настройка готового средства ведения журнала переадресации с именем ConfigurableForwardingLogger.
Создание собственного средства ведения журнала переадресации.
Можно изменить ConfigurableForwardingLogger в соответствии со своими предпочтениями. Для этого вызовите средство ведения журнала в командной строке с помощью MSBuild.exe и перечислите события построения, которые средству ведения журнала следует переадресовать в центральный узел.
Можно также создать пользовательское средство ведения журнала переадресации. Благодаря созданию пользовательского средства ведения журнала переадресации можно выполнить точную настройку функций средства ведения журнала. Однако этот способ гораздо сложнее, чем простая настройка готового ConfigurableForwardingLogger. Для получения дополнительной информации см. Создание средства ведения журнала переадресации.
Использование ConfigurableForwardingLogger для простого распределенного ведения журнала
Чтобы подключить либо ConfigurableForwardingLogger, либо пользовательское средство ведения журнала переадресации, используйте ключ /distributedlogger (сокращенно /dl) в командной строке MSBuild.exe в процессе построения. Для указания имен типов и классов средства ведения журнала используется тот же формат, что и для ключа /logger, с той лишь разницей, что распределенное средство ведения журнала всегда включает два класса: средство ведения журнала переадресации и центральное средство ведения журнала. В приведенном ниже примере показано, как подключить пользовательское средство ведения журнала переадресации с именем XMLForwardingLogger.
msbuild.exe myproj.proj/distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,Culture=neutral
Примечание
В ключе /dl имена двух средств ведения журнала необходимо отделить звездочкой (*).
ConfigurableForwardingLogger используется точно так же, как и любое другое средство ведения журнала (см. описание в разделе Получение журналов построения с помощью MSBuild), с той лишь разницей, что вместо обычного средства ведения журнала MSBuild подключается средство ведения журнала ConfigurableForwardingLogger и в качестве параметров указываются события, которые ConfigurableForwardingLogger будет передавать в центральный узел.
Например, чтобы получать уведомления только о начале и окончании построения, а также сообщения об ошибках, следует передать в качестве параметров события BUILDSTARTEDEVENT, BUILDFINISHEDEVENT и ERROREVENT. Можно передавать несколько параметров, отделяя их друг от друга точкой с запятой. В приведенном ниже примере показано, как использовать ConfigurableForwardingLogger для переадресации только событий BUILDSTARTEDEVENT, BUILDFINISHEDEVENT и ERROREVENT.
msbuild.exe myproj.proj /distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*ConfigureableForwardingLogger,C:\My.dll;BUILDSTARTEDEVENT; BUILDFINISHEDEVENT;ERROREVENT
Далее представлен список доступных параметров ConfigurableForwardingLogger.
Параметры ConfigurableForwardingLogger |
---|
BUILDSTARTEDEVENT |
BUILDFINISHEDEVENT |
PROJECTSTARTEDEVENT |
PROJECTFINISHEDEVENT |
TARGETSTARTEDEVENT |
TARGETFINISHEDEVENT |
TASKSTARTEDEVENT |
TASKFINISHEDEVENT |
ERROREVENT |
WARNINGEVENT |
HIGHMESSAGEEVENT |
NORMALMESSAGEEVENT |
LOWMESSAGEEVENT |
CUSTOMEVENT |
COMMANDLINE |
PERFORMANCESUMMARY |
NOSUMMARY |
SHOWCOMMANDLINE |