Dela via


Skriva loggare som är medvetna om flera processorer

Möjligheten för MSBuild att dra nytta av flera processorer kan minska projektbyggtiden, men det ökar också komplexiteten för att skapa händelseloggning. I en miljö med en processor anländer händelser, meddelanden, varningar och fel till loggaren på ett förutsägbart, sekventiellt sätt. Men i en miljö med flera processorer kan händelser från olika källor komma samtidigt eller utan sekvens.

Att generera en binär logg (-binlog eller -bl växel) och visa den med det strukturerade loggvisningsprogrammet löser till stor del det här problemet. Med MSBuild version 17.8 eller senare kan du även prova terminalloggaren (-tl växeln) för mer användarvänliga loggningsutdata i realtid i konsolen.

För en mer allmän lösning tillhandahåller MSBuild en processoranpassad loggare och en loggningsmodell som du kan använda för att skapa anpassade "vidarebefordrande loggar".

Loggningsutmaningar för flera processorer

När du skapar ett eller flera projekt på ett system med flera processorer eller flera kärnor genereras MSBuild-bygghändelser för alla projekt samtidigt. En lavin av händelsemeddelanden kan komma till loggaren samtidigt eller utan sekvens. Eftersom en MSBuild 2.0-loggare inte är utformad för att hantera den här situationen kan den överbelasta loggaren och orsaka ökade byggtider, felaktiga loggningsutdata eller till och med en trasig version. För att lösa dessa problem kan loggaren bearbeta händelser utan sekvens och korrelera händelser och deras källor.

Du kan förbättra loggningseffektiviteten ännu mer genom att skapa en anpassad vidarebefordranloggare. En anpassad vidarebefordranloggare fungerar som ett filter genom att låta dig välja, innan du skapar, endast de händelser som du vill övervaka. När du använder en anpassad vidarebefordringsloggare kan oönskade händelser inte överbelasta loggaren, störa dina loggar eller förlänga byggtiderna.

Loggningsmodeller för flera processorer

MsBuild stöder två loggningsmodeller, central och distribuerad, för att hantera problem relaterade till flerprocessor-kompileringar.

Central loggningsmodell

I den centrala loggningsmodellen fungerar en enda instans av MSBuild.exe som "central nod" och underordnade instanser av den centrala noden ("sekundära noder") ansluter till den centrala noden för att hjälpa den att utföra bygguppgifter.

Central Logger Model

Loggare av olika typer som ansluter till den centrala noden kallas för "centrala loggare". Endast en instans av varje loggningstyp kan kopplas till den centrala noden samtidigt.

När en kompilering inträffar dirigerar de sekundära noderna sina kompileringshändelser till den centrala noden. Den centrala noden dirigerar alla dess händelser, och även de sekundära nodernas, till en eller flera av de anslutna centrala loggarna. Loggarna skapar sedan loggfiler som baseras på inkommande data.

Även om det endast krävs att ILogger implementeras av den centrala loggaren rekommenderar vi att du även implementerar INodeLogger så att den centrala loggaren initieras med antalet noder som deltar i bygget. Följande överlagring av Initialize-metoden anropas när motorn initierar loggern.

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

Alla befintliga ILogger-baserade loggare kan fungera som centrala loggare och kan kopplas till bygget. Men centrala loggare som skrivits utan uttryckligt stöd för loggningsscenarier med flera processorer och oordnade händelser kan bryta en version eller generera meningslösa utdata.

Distribuerad loggningsmodell

I den centrala loggningsmodellen kan för mycket inkommande meddelandetrafik överbelasta den centrala noden, till exempel när många projekt skapas samtidigt. Detta kan stressa systemresurser och minska byggprestanda. För att lösa det här problemet stöder MSBuild en distribuerad loggningsmodell.

Distribuerad loggningsmodell

Den distribuerade loggningsmodellen utökar den centrala loggningsmodellen genom att du kan skapa en vidarebefordranloggare.

Vidarebefordra loggare

En vidarebefordrande loggare är en sekundär, lätt loggare som har ett händelsefilter som ansluter till en sekundär nod och tar emot inkommande bygghändelser från den noden. Den filtrerar inkommande händelser och vidarebefordrar endast de som du anger till den centrala noden. Detta minskar meddelandetrafiken som skickas till den centrala noden och förbättrar den övergripande byggprestandan.

Det finns två sätt att använda distribuerad loggning på följande sätt:

  • Anpassa den prefabricerade vidarebefordringsloggen med namnet ConfigurableForwardingLogger.

  • Skriv en egen anpassad vidarebefordringsloggare.

Du kan ändra ConfigurableForwardingLogger så att de passar dina behov. För att göra detta anropar du loggaren på kommandoraden med hjälp avMSBuild.exeoch listar de bygghändelser som du vill att loggaren ska vidarebefordra till den centrala noden.

Alternativt kan du skapa en anpassad vidarebefordranloggare. Genom att skapa en anpassad vidarebefordranloggare kan du finjustera loggarens beteende. Att skapa en anpassad vidarebefordranloggare är dock mer komplext än att bara anpassa ConfigurableForwardingLogger. Du kan skapa en vidarebefordranloggare genom att implementera IForwardingLogger gränssnittet, som härleds från ILogger. Gränssnittet definieras som:

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

Om du vill vidarebefordra en händelse som din loggare bryr sig om anropar du ForwardEvent -metoden för IEventRedirector gränssnittet i vidarebefordranloggaren. Skicka lämplig BuildEventArgs, eller ett derivat, som parameter. Händelserna vidarebefordras sedan till den centrala loggaren och kan utföras där.

Mer information finns i Skapa vidarebefordringsloggare.

Använda ConfigurableForwardingLogger för enkel distribuerad loggning

Om du vill koppla en ConfigurableForwardingLogger eller en anpassad vidarebefordranloggare använder du växeln -distributedlogger (-dl för kort) i en MSBuild.exe kommandoradsversion. Formatet för att ange namnen på loggningstyperna och klasserna är detsamma som för växeln -logger , förutom att en distribuerad loggare alltid har två loggningsklasser i stället för en, vidarebefordranloggaren och den centrala loggaren. Följande är ett exempel på hur du kopplar en anpassad vidarebefordranloggare med namnet XMLForwardingLogger.

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

Anmärkning

En asterisk (*) måste avgränsa de två loggningsnamnen i växeln -dl .

ConfigurableForwardingLogger Att använda är som att använda andra loggar (som beskrivs i Hämta byggloggar), förutom att du kopplar ConfigurableForwardingLogger-loggaren i stället för den vanliga MSBuild-loggaren och du anger som parametrar de händelser som du vill att ConfigurableForwardingLogger ska vidarebefordra till den centrala noden.

Om du till exempel bara vill bli meddelad när en kompilering startar och slutar, och när ett fel inträffar, skickar du BUILDSTARTEDEVENT, BUILDFINISHEDEVENT och ERROREVENT som parametrar. Flera parametrar kan skickas genom att avgränsa dem med semikolon. Följande är ett exempel på hur du använder ConfigurableForwardingLogger för att vidarebefordra endast BUILDSTARTEDEVENThändelserna , BUILDFINISHEDEVENToch ERROREVENT .

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

Följande är en lista över tillgängliga ConfigurableForwardingLogger-parametrar.

Parametrar för ConfigurableForwardingLogger
BuildStartadHändelse
BUILDFINISHEDEVENT
ProjektStartEvent
SlutprojektHändelse
TARGETSTARTEDEVENT
MÅLHÄNDELSENSLUTFÖRD
TASKSTARTEDEVENT
TASKFINISHEDEVENT
ERROREVENT
VARNINGSHÄNDELSE
Högmeddelandehändelse
NORMALMESSAGEEVENT
LÅGMEDDELANDEHÄNDELSE
CUSTOMEVENT
kommandorad
PRESTANDASUMMA
NOSUMMARY
SHOWCOMMANDLINE