Scrivere logger compatibili con più processori

La possibilità di MSBuild di sfruttare i vantaggi di più processori può ridurre il tempo di compilazione del progetto, ma aggiunge anche complessità per la compilazione della registrazione eventi. In un ambiente a processore singolo gli eventi, i messaggi, gli avvisi e gli errori arrivano al logger in modo prevedibile e sequenziale. Tuttavia, in un ambiente a più processori gli eventi di diverse origini possono arrivare contemporaneamente o fuori sequenza.

La generazione di un log binario (-binlog o -bl opzione) e la visualizzazione con il visualizzatore di log strutturato risolve in gran parte questo problema. Con MSBuild versione 17.8 o successiva, è anche possibile provare il logger del terminale (-tl opzione) per ottenere un output di registrazione più intuitivo in tempo reale nella console.

Per una soluzione più generale, MSBuild fornisce un logger compatibile con più processori e un modello di registrazione che è possibile usare per creare logger di inoltro personalizzati.

Sfide della registrazione con più processori

Quando si compilano uno o più progetti in un sistema multiprocessore o multi-core, gli eventi di compilazione MSBuild per tutti i progetti vengono generati contemporaneamente. Al logger può arrivare una grande quantità di messaggi sugli eventi contemporaneamente o fuori sequenza. Poiché un logger MSBuild 2.0 non è progettato per gestire questa situazione, può sovraccaricare il logger e causare tempi di compilazione maggiori, output del logger non corretto o persino una compilazione interrotta. Per risolvere questi problemi, il logger può elaborare eventi out-of-sequence e correlare gli eventi e le relative origini.

È possibile migliorare ulteriormente l'efficienza della registrazione creando un logger di inoltro personalizzato. Un logger di inoltro personalizzato funziona come un filtro e consente di scegliere, prima della compilazione, solo gli eventi da monitorare. Quando si usa un logger di inoltro personalizzato, si evita che eventi indesiderati sovraccarichino il logger, creando confusione nei log e rallentando i tempi di compilazione.

Modelli di registrazione con più processori

Per fornire problemi di compilazione relativi a più processori, MSBuild supporta due modelli di registrazione, centrali e distribuiti.

Modello di registrazione centrale

Nel modello di registrazione centrale, una singola istanza di MSBuild.exe agisce come "nodo centrale" e le istanze figlio del nodo centrale ("nodi secondari") vengono allegate al nodo centrale per agevolare le attività di compilazione.

Modello logger centrale

I logger di vari tipi che si collegano al nodo centrale sono noti come "logger centrali". Solo un'istanza di ogni tipo di logger può essere collegata contemporaneamente al nodo centrale.

Durante una compilazione i nodi secondari indirizzano i propri eventi di compilazione al nodo centrale. Il nodo centrale indirizza tutti i propri eventi e quelli dei nodi secondari a uno o più dei logger centrali allegati. I logger quindi creano i file di log in base ai dati in ingresso.

Benché sia richiesta solo l'implementazione di ILogger da parte del logger centrale, si consiglia di implementare anche INodeLogger in modo che il logger centrale venga inizializzato con il numero dei nodi interessati dalla compilazione. Il seguente overload del metodo Initialize richiama quando il motore inizializza il logger.

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

Eventuali logger preesistenti basati su ILoggerpossono fungere da logger centrali ed essere allegati alla compilazione. Tuttavia, i logger centrali scritti senza supporto esplicito per gli scenari di registrazione con più processori e gli eventi in ordine non corretto possono interrompere una compilazione o produrre output non significativo.

Modello di registrazione distribuita

Nel modello di registrazione centrale una quantità eccessiva di traffico di messaggi in ingresso può sovraccaricare il nodo centrale, ad esempio quando si compilano molti progetti contemporaneamente. Questo può comportare un'eccessiva sollecitazione delle risorse di sistema e un peggioramento delle prestazioni di compilazione. Per semplificare questo problema, MSBuild supporta un modello di registrazione distribuita.

Modello di registrazione distribuita

Il modello di registrazione distribuita estende il modello di registrazione centrale consentendo la creazione di un logger di inoltro.

Logger di inoltro

Un logger di inoltro è un logger secondario e leggero con un filtro eventi che viene allegato a un nodo secondario e riceve gli eventi di compilazione in ingresso da quel nodo. Filtra gli eventi in ingresso e inoltra al nodo centrale solo quelli specificati dall'utente. Questo riduce il traffico di messaggi inviato al nodo centrale e migliora complessivamente le prestazioni di compilazione.

Esistono due modi per usare la registrazione distribuita, come indicato di seguito:

  • Personalizzare il logger di inoltro preimpostato denominato ConfigurableForwardingLogger.

  • Scrivere il proprio logger di inoltro personalizzato.

È possibile modificare ConfigurableForwardingLogger in base alle proprie esigenze. A tale scopo, chiamare il logger nella riga di comando usando MSBuild.exe e indicare gli eventi di compilazione che il logger dovrà inoltrare al nodo centrale.

In alternativa, è possibile creare un logger di inoltro personalizzato. Creando un logger di inoltro personalizzato, è possibile ottimizzare il comportamento del logger. Tuttavia, la creazione di un logger di inoltro personalizzato è più complessa rispetto alla personalizzazione di ConfigurableForwardingLogger. È possibile creare un logger di inoltro implementando l'interfaccia IForwardingLogger, che deriva da ILogger. L'interfaccia viene definita come segue:

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

Per inoltrare un evento di cui si occupa il logger, chiamare il ForwardEvent metodo dell'interfaccia IEventRedirector nel logger di inoltro. Passare il valore BuildEventArgs appropriato, o un derivato, come parametro. Gli eventi verranno quindi inoltrati al logger centrale e possono essere eseguiti in tale posizione.

Per altre informazioni, vedere Creazione di logger di inoltro.

Uso di ConfigurableForwardingLogger per la registrazione distribuita semplice

Per collegare uno ConfigurableForwardingLogger o un logger di inoltro personalizzato, usare l'opzione -distributedlogger (-dl per brevità) in una compilazione della riga di comando MSBuild.exe . Il formato da usare per specificare i nomi dei tipi e delle classi del logger è identico a quello usato per l'opzione -logger, ad eccezione del fatto che un logger distribuito ha sempre due classi di registrazione anziché una sola, il logger di inoltro e il logger centrale. Di seguito è riportato un esempio di come allegare un logger di inoltro personalizzato denominato XMLForwardingLogger.

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

Nota

I due nomi di logger nell'opzione -dl devono essere separati da un asterisco (*).

L'uso ConfigurableForwardingLogger di è simile all'uso di qualsiasi altro logger (come descritto in Recupero dei log di compilazione), ad eccezione del fatto che si allega il logger ConfigurableForwardingLogger anziché il logger MSBuild tipico e si specificano come parametri gli eventi che si desidera che configurableForwardingLogger passino al nodo centrale.

Ad esempio, per ricevere una notifica solo all'inizio e alla fine di una compilazione e quando si verifica un errore, è necessario passare BUILDSTARTEDEVENT, BUILDFINISHEDEVENT e ERROREVENT come parametri. Per passare più parametri, separarli con punti e virgola. L'esempio che segue spiega come usare ConfigurableForwardingLogger per inoltrare solo gli eventi BUILDSTARTEDEVENT, BUILDFINISHEDEVENT e ERROREVENT.

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

Di seguito è riportato un elenco dei parametri di ConfigurableForwardingLogger disponibili.

Parametri di ConfigurableForwardingLogger
BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
PROJECTSTARTEDEVENT
PROJECTFINISHEDEVENT
TARGETSTARTEDEVENT
TARGETFINISHEDEVENT
TASKSTARTEDEVENT
TASKFINISHEDEVENT
ERROREVENT
WARNINGEVENT
HIGHMESSAGEEVENT
NORMALMESSAGEEVENT
LOWMESSAGEEVENT
CUSTOMEVENT
COMMANDLINE
PERFORMANCESUMMARY
NOSUMMARY
SHOWCOMMANDLINE