Написание средств ведения журнала с поддержкой многопроцессорности

Поддержка нескольких процессоров в MSBuild позволяет сократить время сборки проекта, но усложняет ведение журнала событий сборки. В среде с одним процессором события, сообщения, предупреждения и ошибки поступают в средство ведения журнала последовательно и вполне предсказуемо. Однако в многопроцессорной среде события из различных источников могут поступать одновременно или не по порядку.

Создание двоичного журнала (-binlog или -bl коммутатора) и просмотр его с помощью структурированного средства просмотра журналов в значительной степени решает эту проблему. С помощью MSBuild версии 17.8 или более поздней можно также попробовать средство ведения журнала терминала (-tl переключатель) для получения более удобных выходных данных ведения журнала в режиме реального времени в консоли.

Для более общего решения MSBuild предоставляет средство ведения журнала с поддержкой нескольких процессоров и модель ведения журнала, которую можно использовать для создания пользовательских "переадресации средств ведения журнала".

Проблемы ведения журналов в многопроцессорной системе

Если выполняется сборка одного или нескольких проектов в многопроцессорной или многоядерной системе, в MSBuild одновременно создаются события сборки для всех проектов. Множество сообщений о событиях может поступать в средство ведения журнала одновременно или не по порядку. Так как средство ведения журнала MSBuild 2.0 не предназначено для решения такой ситуации, может произойти его переполнение, что повлечет за собой увеличение времени сборки, появление неверных выходных данных или даже повреждение сборки. Для решения этих проблем средство ведения журнала может обрабатывать события вне последовательности и сопоставлять события и их источники.

Чтобы повысить эффективность функции ведения журнала, создайте пользовательское средство ведения журнала с перенаправлением. Оно действует как фильтр, позволяя выбрать перед сборкой только те события, за которыми нужно вести наблюдение. Благодаря пользовательскому средству ведения журнала с перенаправлением можно предотвратить переполнение средства ведения журнала ненужными событиями, загромождение журналов или замедление сборки.

Модели ведения журналов в многопроцессорной системе

Для решения проблем, возникающих при сборке в многопроцессорной среде, MSBuild поддерживает две модели ведения журналов: централизованную и распределенную.

Централизованная модель ведения журналов

В централизованной модели ведения журналов один экземпляр MSBuild.exe действует как центральный узел, а дочерние экземпляры центрального узла (дополнительные узлы) подключаются к нему, чтобы оказать помощь в выполнении задач сборки.

Централизованная модель средства ведения журнала

Средства ведения журнала различных типов, подключаемые к центральному узлу, называются "центральными средствами ведения журнала". Только один экземпляр средства ведения журнала каждого типа можно одновременно подключить к центральному узлу.

В процессе сборки дополнительные узлы перенаправляют события сборки в центральный узел. Центральный узел перенаправляет все свои события, а также события дополнительных узлов в одно или несколько подключенных центральных средств ведения журнала. В средствах ведения журнала создаются файлы журнала на основе входящих данных.

Несмотря на то, что центральным средством ведения журнала должен реализовываться только интерфейс ILogger, рекомендуется также реализовать интерфейс INodeLogger для инициализации центрального средства ведения журнала с учетом числа узлов, участвующих в сборке. При инициализации средства ведения журнала в системе вызывается следующая перегрузка метода Initialize:

public interface INodeLogger: ILogger
{
    public void Initialize(IEventSource eventSource, int nodeCount);
}

Все ранее существовавшие средства ведения журнала на основе ILogger могут работать в качестве центральных средств ведения журнала и подключаться к сборке. Однако центральные средства ведения журнала, созданные без явной поддержки сценариев ведения журнала в многопроцессорной среде и непоследовательных событий, могут привести к нарушению сборки или появлению бессмысленных выходных данных.

Распределенная модель ведения журнала

В централизованной модели ведения журналов слишком большой трафик входящих сообщений может вызывать переполнение центрального узла, например, когда одновременно выполняется сборка множества проектов. При этом может увеличиться нагрузка на системные ресурсы и снизиться производительность сборки. Чтобы облегчить эту проблему, MSBuild поддерживает распределенную модель ведения журналов.

Распределенная модель ведения журнала

Распределенная модель ведения журналов расширяет централизованную модель, позволяя создавать средства ведения журнала с перенаправлением.

Средства ведения журнала с возможностью перенаправления

Средство ведения журнала с перенаправлением — это дополнительный, упрощенный вариант средства ведения журнала, содержащий фильтр событий, который подключается к дополнительному узлу и принимает входящие события сборки от него. Это средство фильтрует входящие события и перенаправляет в центральный узел только те из них, которые вы указали. В результате уменьшается трафик сообщений, отправляемых в центральный узел, и повышается общая производительность сборки.

Существует два способа использования модели распределенного ведения журналов, а именно:

  • настройка готового средства ведения журнала с перенаправлением с именем ConfigurableForwardingLogger;

  • создание собственного средства ведения журнала с перенаправлением.

Вы можете изменить ConfigurableForwardingLogger в соответствии с вашими требованиями. Для этого вызовите средство ведения журнала в командной строке с помощью MSBuild.exe и перечислите события сборки, которые средству ведения журнала следует перенаправлять в центральный узел.

Можно также создать пользовательское средство ведения журнала с перенаправлением. Таким образом можно выполнить точную настройку функций средства ведения журнала. Однако этот способ гораздо сложнее, чем простая настройка готового средства ConfigurableForwardingLogger. Вы можете создать средство ведения журнала с переадресацией, реализовав интерфейс IForwardingLogger, который является производным от ILogger. Этот интерфейс определяется следующим образом:

public interface IForwardingLogger: INodeLogger
{
    public IEventRedirector EventRedirector { get; set; }
    public int NodeId { get; set; }
}

Чтобы перенаправить событие, которое ваш средство ведения журнала заботится, вызовите ForwardEvent метод IEventRedirector интерфейса в средстве ведения журнала пересылки. В качестве параметра передайте соответствующий BuildEventArgs или производный от него. Затем события перенаправятся в центральный средство ведения журнала и могут выполняться там.

Дополнительные сведения см. здесь.

Использование средства 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 Используя любой другой средство ведения журнала (как описано в журналах сборки получения), за исключением того, что вы присоединяете средство ведения журнала ConfigurableForwardingLogger вместо типичного средства ведения журнала MSBuild и указываете в качестве параметров события, которые необходимо передать в центральный узел 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