Zápis protokolovacích nástrojů pracujících s více procesory
Schopnost nástroje MSBuild využívat více procesorů může zkrátit dobu sestavování projektu, ale také zvyšuje složitost protokolování událostí. V prostředí s jedním procesorem se události, zprávy, upozornění a chyby dorazí do protokolovacího nástroje předvídatelným a sekvenčním způsobem. V prostředí s více procesory ale události z různých zdrojů mohou docházet současně nebo mimo posloupnost.
Tento problém řeší generování binárního protokolu (-binlog
nebo -bl
přepínače) a jeho zobrazení pomocí strukturovaného prohlížeče protokolů. S nástrojem MSBuild verze 17.8 nebo novějším můžete také vyzkoušet protokolovací nástroj terminálu (-tl
přepínač) pro uživatelsky přívětivější výstup protokolování v reálném čase v konzole.
Pro obecnější řešení poskytuje NÁSTROJ MSBuild protokolovací nástroj s podporou více procesorů a model protokolování, který můžete použít k vytvoření vlastních "protokolovacích nástrojů pro předávání".
Problémy s protokolováním více procesorů
Při sestavování jednoho nebo více projektů v systému s více procesory nebo více jádry se události sestavení MSBuild pro všechny projekty generují současně. Lavina zpráv událostí může dorazit do protokolovacího nástroje ve stejnou dobu nebo mimo posloupnost. Vzhledem k tomu, že protokolovací nástroj MSBuild 2.0 není navržen tak, aby tuto situaci zvládl, může zahltit protokolovací nástroj a způsobit zvýšenou dobu sestavení, nesprávný výstup protokolovacího nástroje nebo dokonce přerušené sestavení. Aby bylo možné tyto problémy vyřešit, může protokolovací nástroj zpracovávat události mimo posloupnost a korelovat události a jejich zdroje.
Efektivitu protokolování lze ještě více zlepšit vytvořením vlastního předávajícího protokolovacího nástroje. Vlastní protokolovací nástroj pro předávání funguje jako filtr tím, že vám umožní vybrat si před sestavením pouze události, které chcete monitorovat. Pokud používáte vlastní protokolovací nástroj pro předávání, nežádoucí události nemohou protokolovací nástroj zahltit, nepotřebné protokoly ani pomalé doby sestavení.
Modely protokolování více procesorů
Pro zajištění problémů s sestavením souvisejících s více procesory podporuje nástroj MSBuild dva modely protokolování, centrální a distribuované.
Model centrálního protokolování
V modelu centrálního protokolování funguje jedna instance MSBuild.exe jako "centrální uzel" a podřízené instance centrálního uzlu ("sekundární uzly") připojují k centrálnímu uzlu, aby bylo možné provádět úlohy sestavení.
Protokolovací nástroje různých typů, které se připojují k centrálnímu uzlu, se označují jako "centrální protokolovací nástroje". Ke centrálnímu uzlu lze současně připojit pouze jednu instanci každého typu protokolovacího modulu.
Když dojde k sestavení, sekundární uzly směrují události sestavení do centrálního uzlu. Centrální uzel směruje všechny své události a také sekundární uzly do jednoho nebo více připojených centrálních protokolovacích souborů. Protokolovací nástroje pak vytvoří soubory protokolu založené na příchozích datech.
I když centrální protokolovací nástroj musí implementovat jenom ILogger centrální protokolovací nástroj, doporučujeme také implementovat INodeLogger , aby se centrální protokolovací modul inicializoval s počtem uzlů, které se účastní sestavení. Následující přetížení Initialize metody vyvolá, když modul inicializuje protokolovací modul.
public interface INodeLogger: ILogger
{
public void Initialize(IEventSource eventSource, int nodeCount);
}
Všechny dříve existující ILoggerprotokolovací nástroje můžou fungovat jako centrální protokolovací nástroje a můžou se připojit k sestavení. Centrální protokolovací nástroje napsané bez explicitní podpory scénářů protokolování s více procesory a událostí mimo pořadí však můžou přerušit sestavení nebo vytvořit bezvýznamný výstup.
Model distribuovaného protokolování
V modelu centrálního protokolování může příliš mnoho příchozích přenosů zpráv zahltit centrální uzel, například když se najednou sestaví mnoho projektů. To může zdůraznit systémové prostředky a snížit výkon sestavení. Pro usnadnění tohoto problému nástroj MSBuild podporuje distribuovaný model protokolování.
Model distribuovaného protokolování rozšiřuje centrální model protokolování tím, že umožňuje vytvořit protokolovací nástroj pro předávání.
Předávací protokolovací nástroje
Protokolovací modul pro předávání je sekundární odlehčený protokolovací modul, který má filtr událostí, který se připojuje k sekundárnímu uzlu a přijímá příchozí události sestavení z daného uzlu. Filtruje příchozí události a předává pouze ty, které zadáte do centrálního uzlu. Tím se sníží přenos zpráv odesílaný do centrálního uzlu a zlepší se celkový výkon sestavení.
Distribuované protokolování můžete použít dvěma způsoby:
Upravte předpřipravený protokolovací protokolovací protokolovač s názvem ConfigurableForwardingLogger.
Napište vlastní protokolovací nástroj pro předávání.
Můžete ho upravit ConfigurableForwardingLogger
tak, aby vyhovoval vašim požadavkům. Uděláte to tak, že zavoláte protokolovací modul na příkazovém řádku pomocí MSBuild.exe a zobrazíte seznam událostí sestavení, které má protokolovací modul předávat do centrálního uzlu.
Jako alternativu můžete vytvořit vlastní protokolovací nástroj pro předávání. Vytvořením vlastního protokolovacího nástroje pro předávání můžete doladit chování protokolovacího nástroje. Vytvoření vlastního protokolovacího nástroje pro předávání je ale složitější než jen přizpůsobení KonfigurovatelnéhoForwardingLoggeru. Předávající protokolovací nástroj je možné vytvořit implementováním rozhraní IForwardingLogger, které je odvozeno z rozhraní ILogger. Rozhraní je definováno takto:
public interface IForwardingLogger: INodeLogger
{
public IEventRedirector EventRedirector { get; set; }
public int NodeId { get; set; }
}
Chcete-li přeposlat událost, o kterou váš protokolovač pečuje, zavolejte ForwardEvent metodu IEventRedirector rozhraní v protokolovacím nástroji pro předávání. Předejte příslušné argumenty BuildEventArgs nebo jejich odvozené části jako parametr. Události se pak předají centrálnímu protokolovacímu modulu a můžou se tam jednat.
Další informace naleznete v tématu Vytváření dopředné protokolovací nástroje.
Použití KonfigurovatelnéhoForwardingLoggeru pro jednoduché distribuované protokolování
Pokud chcete připojit buď ConfigurableForwardingLogger
vlastní protokolovací nástroj pro předávání, použijte -distributedlogger
přepínač (-dl
zkráceně) v sestavení příkazového řádku MSBuild.exe . Formát pro zadání názvů typů a tříd protokolovacího nástroje je stejný jako pro přepínač, s tím rozdílem, že distribuovaný -logger
protokolovací nástroj má vždy dvě třídy protokolování místo jedné, předávací protokolovací nástroj a centrální protokolovací nástroj. Následuje příklad připojení vlastního předávacího protokolovacího nástroje s názvem XMLForwardingLogger.
msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,Culture=neutral
Poznámka:
Hvězdička (*) musí oddělit dva názvy protokolovacího nástroje v přepínači -dl
.
ConfigurableForwardingLogger
Použití se podobá použití libovolného jiného protokolovacího nástroje (jak je uvedeno v části Získání protokolů sestavení), s výjimkou toho, že místo typického protokolovacího nástroje MSBuild připojíte konfigurovatelný protokolovací nástrojForwardingLogger a zadáte jako parametry události, které chcete konfigurovatelnémuForwardingLoggeru předat do centrálního uzlu.
Pokud například chcete být upozorněni pouze při spuštění a ukončení sestavení a v případě, že dojde k chybě, předáte BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
ERROREVENT
a jako parametry. Více parametrů lze předat jejich oddělením středníky. Následuje příklad použití KonfigurovatelnéForwardingLogger k předávání pouze BUILDSTARTEDEVENT
, BUILDFINISHEDEVENT
a ERROREVENT
události.
msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*ConfigureableForwardingLogger,C:\My.dll;BUILDSTARTEDEVENT; BUILDFINISHEDEVENT;ERROREVENT
Následuje seznam dostupných parametrů ConfigurableForwardingLogger.
Konfigurovatelné parametryForwardingLogger |
---|
BUILDSTARTEDEVENT |
BUILDFINISHEDEVENT |
PROJECTSTARTEDEVENT |
PROJECTFINISHEDEVENT |
TARGETSTARTEDEVENT |
TARGETFINISHEDEVENT |
TASKSTARTEDEVENT |
TASKFINISHEDEVENT |
ERROREVENT |
WARNINGEVENT |
HIGHMESSAGEEVENT |
NORMALMESSAGEEVENT |
LOWMESSAGEEVENT |
CUSTOMEVENT |
COMMANDLINE |
PERFORMANCESUMMARY |
NOSUMMARY |
SHOWCOMMANDLINE |