Escribir registradores que reconocen varios procesadores

La capacidad de MSBuild para aprovechar las ventajas de varios procesadores puede disminuir el tiempo de compilación de los proyectos, pero también agrega complejidad al registro de eventos de compilación. En un entorno de un solo procesador, los eventos, mensajes, advertencias y errores llegan al registrador de una manera predecible y secuencial. Sin embargo, en un entorno de varios procesadores, pueden llegar eventos de orígenes diferentes al mismo tiempo o desordenados.

Generar un registro binario (-binlog o -bl cambiar) y verlo con el visor de registros estructurado resuelve en gran medida este problema. Con MSBuild versión 17.8 o una versión posterior, también puede probar el registrador de terminal (-tl conmutador) para obtener una salida de registro más fácil de usar en tiempo real en la consola.

Para una solución más general, MSBuild proporciona un registrador que reconoce varios procesadores y un modelo de registro, y permite crear "registradores de reenvío" personalizados.

Dificultades del registro de varios procesadores

Cuando se compilan uno o varios proyectos en un sistema de varios procesadores o varios núcleos, los eventos de compilación de MSBuild de todos los proyectos se generan al mismo tiempo. Es posible que llegue una avalancha de mensajes de eventos al registrador al mismo tiempo o desordenados. Debido a que el registrador de MSBuild 2.0 no está diseñado para administrar esta situación, puede sobrecargar el registrador y provocar un aumento en el tiempo de compilación, resultados incorrectos del registrador o incluso la interrupción de una compilación. Para resolver estos problemas, el registrador puede procesar eventos desordenados y asociar los eventos y sus orígenes.

Puede mejorar más la eficacia del registro creando un registrador de reenvío personalizado. Un registrador de reenvío personalizado actúa como filtro que le permite elegir, antes de compilar, únicamente los eventos que desea supervisar. Cuando se utiliza un registrador de reenvío personalizado, los eventos no deseados no sobrecargan el registrador, desordenan los registros ni ralentizan el tiempo de compilación.

Modelos de registro para varios procesadores

Para solucionar los problemas de compilación para varios procesadores, MSBuild admite dos modelos de registro, central y distribuido.

Modelo de registro central

En el modelo de registro central, una única instancia de MSBuild.exe actúa como "nodo central" y las instancias secundarias del nodo central ("nodos secundarios") se asocian al nodo central para ayudarle a realizar las tareas de compilación.

Modelo de registrador central

Los registradores de varios tipos que se asocian al nodo central se conocen como "registradores centrales". Solo se puede adjuntar una instancia de cada tipo de registrador al nodo central al mismo tiempo.

Cuando se produce una compilación, los nodos secundarios enrutan sus eventos de compilación al nodo central. El nodo central enruta todos sus eventos y también los de los nodos secundarios, a uno o varios registradores centrales asociados. A continuación, los registradores crean archivos de registro basados en los datos entrantes.

Aunque sólo es necesario que el registrador central implemente ILogger, es recomendable que también implemente INodeLogger para que el registrador central se inicialice con el número de nodos que están participando en la compilación. Se invoca la siguiente sobrecarga del método Initialize cuando el motor inicializa el registrador.

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

Los registradores basados en ILogger ya existentes pueden actuar como registradores centrales y asociarse a la compilación. Sin embargo, los registradores centrales escritos sin compatibilidad explícita para escenarios de registro de varios procesadores y los eventos desordenados podrían interrumpir una compilación o producir un resultado sin sentido.

Modelo de registro distribuido

En el modelo de registro central, un tráfico excesivo de mensajes entrantes puede sobrecargar el nodo central, como cuando se compilan muchos proyectos al mismo tiempo. Esto puede saturar los recursos del sistema y disminuir el rendimiento de la compilación. Para solucionar este problema, MSBuild admite un modelo de registro distribuido.

Modelo de registro distribuido

El modelo de registro distribuido amplía el modelo de registro central y permite crear un registrador de reenvío.

Registradores de reenvío

Un registrador de reenvío es un registrador secundario ligero que tiene un filtro de eventos que se asocia a un nodo secundario y recibe los eventos de compilación de entrada de ese nodo. Filtra los eventos de entrada y reenvía al nodo central sólo los que especifique. De esta manera se reduce el tráfico de mensajes que se envía al nodo central y mejora el rendimiento general de la compilación.

Hay dos maneras de utilizar el registro distribuido, como se indica a continuación:

  • Personalizar el registrador de reenvío prefabricado denominado ConfigurableForwardingLogger.

  • Escribir su propio registrador de reenvío personalizado.

Puede modificar ConfigurableForwardingLogger para adaptarla a sus requisitos. Para ello, llame al registrador en la línea de comandos mediante MSBuild.exe y enumere los eventos de compilación que desea que el registrador reenvíe al nodo central.

Otra opción es crear un registrador de reenvío personalizado. Creando un registrador de reenvío personalizado puede afinar el comportamiento del registrador. Sin embargo, crear un registrador de reenvío personalizado es más complejo que simplemente personalizar ConfigurableForwardingLogger. Para crear un registrador de reenvío, puede implementar la interfaz IForwardingLogger, derivada de ILogger. La interfaz se define como:

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

Para reenviar un evento en el que se preocupa el registrador, llame al ForwardEvent método de la interfaz en el IEventRedirector registrador de reenvío. Pase el BuildEventArgs adecuado, o un derivado, como parámetro. Los eventos se reenviarán al registrador central y se podrán actuar allí.

Para más información, consulte Crear registradores de reenvío.

Uso de ConfigurableForwardingLogger para el registro distribuido simple

Para asociar ConfigurableForwardingLogger o un registrador de reenvío personalizado, use el modificador -distributedlogger (-dl abreviado) en una compilación de línea de comandos de MSBuild.exe. El formato para especificar los nombres de los tipos y clases del registrador es igual que el del modificador -logger, sólo que un registrador distribuido siempre tiene dos clases de registro en lugar de una: el registrador de reenvío y el registrador central. A continuación, se muestra un ejemplo de cómo asociar un registrador de reenvío personalizado denominado XMLForwardingLogger.

msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,Culture=neutral

Nota

Un asterisco (*) debe separar los dos nombres de registrador en el modificador -dl.

Usar ConfigurableForwardingLogger es como usar cualquier otro registrador (como se explica en Obtener registros de compilación), solo que se asocia el registrador ConfigurableForwardingLogger en lugar del registrador de MSBuild típico, y se especifican como parámetros los eventos que quiere que ConfigurableForwardingLogger pase al nodo central.

Por ejemplo, si desea ser notificado únicamente cuando una compilación comienza y termina y cuando se produce un error, pasaría BUILDSTARTEDEVENT, BUILDFINISHEDEVENT y ERROREVENT como parámetros. Se puede pasar varios parámetros separándolos con punto y coma. A continuación, se muestra un ejemplo de cómo utilizar ConfigurableForwardingLogger para reenviar sólo los eventos BUILDSTARTEDEVENT, BUILDFINISHEDEVENT y ERROREVENT.

msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*ConfigureableForwardingLogger,C:\My.dll;BUILDSTARTEDEVENT; BUILDFINISHEDEVENT;ERROREVENT

A continuación, se muestra una lista de los parámetros de ConfigurableForwardingLogger disponibles.

Parámetros de ConfigurableForwardingLogger
BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
PROJECTSTARTEDEVENT
PROJECTFINISHEDEVENT
TARGETSTARTEDEVENT
TARGETFINISHEDEVENT
TASKSTARTEDEVENT
TASKFINISHEDEVENT
ERROREVENT
WARNINGEVENT
HIGHMESSAGEEVENT
NORMALMESSAGEEVENT
LOWMESSAGEEVENT
CUSTOMEVENT
COMMANDLINE
PERFORMANCESUMMARY
NOSUMMARY
SHOWCOMMANDLINE