Ведение журнала в многопроцессорной среде
MSBuild возможность использования нескольких процессоров позволяет значительно сократить время построения проекта, но усложняет ведение журнала. В среде с одним процессором средство ведения журнала может обрабатывать входящие события, сообщения, предупреждения и ошибки последовательно и вполне предсказуемо. Но в многопроцессорной среде события из разных источников могут поступать одновременно или не по порядку. MSBuild предоставляет новое решения в приложении ведение журнала и обеспечивает создание пользовательских «ведений журнала препровождения».
Ведение журнала при многопроцессорных построениях
При построении один или несколько проектов в многопроцессорной или многоядерной системе, события построения MSBuild для всех проектов создаются одновременно. Лавина данных событий может приехать в средство ведения журнала в то же время или из последовательности. Это может произойти переполнение средства ведения журнала, что повлечет за собой увеличение времени построения, неверный результат ведения журнала или даже повреждение построения. Для устранения этих проблем ведение журнала MSBuild может процесс события выхода последовательности и события коррелата и их источников.
Чтобы повысить эффективность функции ведения журнала, создайте пользовательское средство ведения журнала переадресации. Созданное пользователем средство ведения журнала переадресации действует как фильтр, позволяя перед построением выбрать события, за которыми нужно вести наблюдение. Благодаря пользовательскому средству ведения журнала переадресации можно предотвратить переполнение средства ведения журнала ненужными событиями, загромождение журналов или замедление построения.
Централизованная модель ведения журнала
Для многопроцессорных построений в MSBuild используется "централизованная модель ведения журнала". В этой централизованной модели один экземпляр MSBuild.exe действует в качестве основного процесса построения, или "центрального узла". К центральному узлу подключены дополнительные экземпляры MSBuild.exe, или "дополнительные узлы". Все средства ведения журнала, поддерживающие ILogger и подключенные к центральному узлу, называются "центральными средствами ведения журнала", а средства ведения журнала, подключенные к дополнительным узлам, называются "дополнительными средствами ведения журнала".
При построении дополнительные средства ведения журнала осуществляют переадресацию своего трафика событий в центральные средства ведения журнала. Поскольку события исходят из нескольких дополнительных узлов, данные поступают в центральный узел одновременно, но при этом чередуются. Для разрешения ссылок типа "событие-проект" и "событие-целевой объект" в аргументы события включается добавочная контекстная информация о событии построения.
Несмотря на то, что центральным средством ведения журнала должна быть реализована только задача ILogger, рекомендуется также реализовать задачу INodeLogger для инициализации центрального средства ведения журнала с учетом числа узлов, участвующих в построении. При инициализации средства ведения журнала в системе вызывается следующая перегрузка метода Initialize:
public interface INodeLogger: ILogger
{
public void Initialize(IEventSource eventSource, int nodeCount);
}
Распределенная модель ведения журнала
В централизованной модели ведения журнала такой большой трафик входящих сообщений, что при одновременном построении множества проектов может произойти переполнение центрального узла, в результате чего увеличивается нагрузка на систему и снижается производительность построения.
Чтобы снизить вероятность появления этой проблемы в MSBuild поддерживается также "распределенная модель ведения журналов", которая расширяет централизованную модель за счет создания средств ведения журналов переадресации. Средство ведения журнала переадресации подключается к дополнительному узлу и принимает входящие события построения от этого узла. Средство ведения журнала переадресации похоже на обычное средство ведения журнала, но, в отличие от обычного средства, может фильтровать события и переадресовывать только нужные в центральный узел. В результате уменьшается трафик сообщений в центральном узле и, соответственно, повышается производительность.
Чтобы создать средство ведения журнала переадресации, выполните реализацию интерфейса IForwardingLogger, получаемого из ILogger. Интерфейс определяется следующим образом:
public interface IForwardingLogger: INodeLogger
{
public IEventRedirector EventRedirector { get; set; }
public int NodeId { get; set; }
}
Для переадресации событий в средстве ведения журнала переадресации вызовите метод ForwardEvent интерфейса IEventRedirector. В качестве параметра передайте BuildEventArgs или производную.
Для получения дополнительной информации см. Создание средства ведения журнала переадресации.
Подключение распределенного средства ведения журнала
Чтобы подключить распределенное средство ведения журнала в построении с использованием командной строки, используйте ключ /distributedlogger (сокращенно /dl). Для указания имен типов и классов средства ведения журнала используется тот же формат, что и для ключа /logger, с той лишь разницей, что распределенное средство ведения журнала включает два класса: средство ведения журнала переадресации и центральное средство ведения журнала. Пример подключения распределенного средства ведения журнала:
msbuild.exe *.proj /distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,
Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,
Culture=neutral
В ключе /dl имена двух средств ведения журнала отделяются звездочкой (*).