Registrar en un entorno de varios procesadoresLogging in a multi-processor environment

La capacidad de MSBuild para usar varios procesadores puede reducir significativamente el tiempo de compilación de los proyectos, pero también agrega complejidad al proceso de registro.The ability of MSBuild to use multiple processors can greatly decrease project building time, but it also adds complexity to logging. En un entorno de un solo procesador, el registrador puede administrar eventos de entrada, mensajes, advertencias y errores de una manera predecible y secuencial.In a single-processor environment, the logger can handle incoming events, messages, warnings, and errors in a predictable, sequential manner. Sin embargo, en un entorno de varios procesadores, los eventos de varios orígenes pueden llegar simultáneamente o desordenados.However, in a multi-processor environment, events from several sources can arrive simultaneously or out of sequence. MSBuild dispone de un nuevo registrador para varios procesadores y habilita la creación de "registradores de reenvío" personalizados.MSBuild provides a new multi-processor-aware logger and enables the creation of custom "forwarding loggers."

Registrar compilaciones de varios procesadoresLog multiple-processor builds

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 simultáneamente.When you build one or more projects in a multi-processor or multi-core system, MSBuild build events for all the projects are generated simultaneously. Es posible que llegue una avalancha de datos de eventos al registrador al mismo tiempo o que vengan desordenados.An avalanche of event data may arrive at the logger at the same time or out of sequence. Esto puede sobrecargar el registrador y producir un aumento del tiempo de compilación, una salida incorrecta del registrador o incluso la interrupción de una compilación.This can overwhelm the logger and cause increased build times, incorrect logger output, or even a broken build. Para resolver estos problemas, el registrador de MSBuild puede procesar eventos desordenados y asociar los eventos y sus orígenes.To address these issues, the MSBuild logger can process out-of-sequence events and correlate events and their sources.

Puede mejorar más la eficacia del registro creando un registrador de reenvío personalizado.You can improve logging efficiency even more by creating a custom forwarding logger. Un registrador de reenvío personalizado actúa como filtro que le permite elegir, antes de compilar, los eventos que desea supervisar.A custom-forwarding logger acts as a filter by letting you choose, before you build, the events you want to monitor. 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.When you use a custom forwarding logger, unwanted events do not overwhelm the logger, clutter your logs, or slow build times.

Modelo de registro centralCentral logging model

Para compilaciones de varios procesadores, MSBuild utiliza un "modelo de registro central".For multi-processor builds, MSBuild uses a "central logging model." En el modelo de registro central, una instancia de MSBuild.exe actúa como proceso de compilación principal o "nodo central".In the central logging model, an instance of MSBuild.exe acts as the primary build process, or "central node." Las instancias secundarias de MSBuild.exe, o "nodos secundarios", se asocian al nodo central.Secondary instances of MSBuild.exe, or "secondary nodes," are attached to the central node. Los registradores basados en ILogger asociados al nodo central se conocen como "registradores centrales" y los registradores asociados a los nodos secundarios se conocen como "registradores secundarios".Any ILogger-based loggers attached to the central node are known as "central loggers" and loggers attached to secondary nodes are known as "secondary loggers."

Cuando se realiza una compilación, los registradores secundarios enrutan su tráfico de eventos a los registradores centrales.When a build occurs, the secondary loggers route their event traffic to the central loggers. Debido a que los eventos se originan en varios nodos secundarios, los datos llegan al nodo central simultáneamente pero intercalados.Because events originate at several secondary nodes, the data arrives at the central node simultaneously but interleaved. Para resolver las referencias entre eventos y proyectos y entre eventos y destinos, los argumentos de evento incluyen la información contextual adicional acerca del evento de compilación.To resolve event-to-project and event-to-target references, the event arguments include additional build event context information.

Aunque sólo es necesario que el registrador central implemente ILogger, es recomendable que también implemente INodeLogger si desea que el registrador central se inicialice con el número de nodos que están participando en la compilación.Although only ILogger is required to be implemented by the central logger, we recommend that you also implement INodeLogger if you want the central logger to initialize with the number of nodes that are participating in the build. Se invoca la siguiente sobrecarga del método Initialize cuando el motor inicializa el registrador:The following overload of the Initialize method is invoked when the engine initializes the logger:

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

Modelo de registro distribuidoDistributed logging model

En el modelo de registro central, un tráfico excesivo de mensajes entrantes, como cuando se compilan muchos proyectos al mismo tiempo, puede sobrecargar el nodo central, saturando el sistema y disminuyendo el rendimiento de la compilación.In the central logging model, too much incoming message traffic, such as when many projects build at once, can overwhelm the central node, which stresses the system and lowers build performance.

Para reducir este problema, MSBuild habilita también un "modelo de registro distribuido" que amplía el modelo de registro central permitiendo crear registradores de reenvío.To reduce this problem, MSBuild also enables a "distributed logging model" that extends the central logging model by letting you create forwarding loggers. Un registrador de reenvío se asocia a un nodo secundario y recibe los eventos de compilación entrantes de ese nodo.A forwarding logger is attached to a secondary node and receives incoming build events from that node. El registrador de reenvío es como un registrador normal sólo que puede filtrar los eventos y, a continuación, reenviar sólo los deseados al nodo central.The forwarding logger is just like a regular logger except that it can filter the events and then forward only the desired ones to the central node. De esta manera se reduce el tráfico de mensajes en el nodo central y, por consiguiente, habilita la mejora del rendimiento.This reduces the message traffic at the central node and therefore enables better performance.

Para crear un registrador de reenvío, puede implementar la interfaz IForwardingLogger, derivada de ILogger.You can create a forwarding logger by implementing the IForwardingLogger interface, which derives from ILogger. La interfaz se define como:The interface is defined as:

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

Para reenviar los eventos de un registrador de reenvío, llame al método ForwardEvent de la interfaz IEventRedirector.To forward events in a forwarding logger, call the ForwardEvent method of the IEventRedirector interface. Pase el BuildEventArgs adecuado, o un derivado, como parámetro.Pass the appropriate BuildEventArgs, or a derivative, as the parameter.

Para obtener más información, vea Crear registradores de reenvío.For more information, see Create forwarding loggers.

Asociar un registrador distribuidoAttaching a distributed logger

Para asociar un registrador distribuido en una compilación de la línea de comandos, utilice el modificador -distributedlogger (o, -dl abreviado).To attaching a distributed logger on a command line build, use the -distributedlogger (or, -dl for short) switch. 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 consta de dos clases de registro: un registrador de reenvío y un registrador central.The format for specifying the names of the logger types and classes are the same as those for the -logger switch, except that a distributed logger is comprised of two logging classes: a forwarding logger and a central logger. A continuación, se muestra un ejemplo de cómo asociar un registrador distribuido:Following is an example of attaching a distributed logger:

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

Un asterisco (*) separa los dos nombres de registrador en el modificador -dl.An asterisk (*) separates the two logger names in the -dl switch.

Vea tambiénSee also

Registradores de compilación Build loggers
Crear registradores de reenvíoCreate forwarding loggers