Çok işlemcili günlükçüler yazma

MSBuild'in birden çok işlemciden yararlanma özelliği proje oluşturma süresini azaltabilir, ancak olay günlüğü oluşturma karmaşıklığını da artırır. Tek işlemcili bir ortamda olaylar, iletiler, uyarılar ve hatalar günlükçüye tahmin edilebilir, sıralı bir şekilde ulaşır. Ancak, çok işlemcili bir ortamda, farklı kaynaklardan olaylar aynı anda veya sıra dışı olarak gelebilir.

İkili günlük (-binlogveya -bl anahtar) oluşturmak ve yapılandırılmış günlük görüntüleyicisi ile görüntülemek bu sorunu büyük ölçüde çözer. MSBuild sürüm 17.8 veya üzeri ile, konsolda gerçek zamanlı olarak daha kullanıcı dostu günlük çıkışı için terminal günlükçüsüsü (-tl anahtar) seçeneğini de deneyebilirsiniz.

Daha genel bir çözüm için MSBuild, çok işlemcili bir günlükçü ve özel "iletme günlükçüleri" oluşturmak için kullanabileceğiniz bir günlük modeli sağlar.

Çok işlemcili günlüğe kaydetme zorlukları

Çok işlemcili veya çok çekirdekli bir sistemde bir veya daha fazla proje oluşturduğunuzda, tüm projeler için MSBuild derleme olayları aynı anda oluşturulur. Olay iletilerinin bir çığı günlükçüye aynı anda veya sıra dışı olarak gelebilir. Bir MSBuild 2.0 günlükçü bu durumu işlemek için tasarlanmamış olduğundan, günlükçüye aşırı yükleme yapabilir ve derleme sürelerinin artmasına, yanlış günlükçü çıkışına, hatta bozuk bir derlemeye neden olabilir. Günlükçü bu sorunları gidermek için sıra dışı olayları işleyebilir ve olaylarla kaynakları arasında bağıntı oluşturabilir.

Özel bir iletme günlükçüsüsü oluşturarak günlük verimliliğini daha da artırabilirsiniz. Özel iletme günlükçüleri, derlemeden önce yalnızca izlemek istediğiniz olayları seçmenize izin vererek filtre işlevi görür. Özel bir iletme günlükçü kullandığınızda, istenmeyen olaylar günlükçüye aşırı yüklenmez, günlüklerinizi karmaşık hale getirmek veya derleme sürelerini yavaşlatamaz.

Çok işlemcili günlük modelleri

ÇOK işlemcili derleme sorunlarını sağlamak için MSBuild, merkezi ve dağıtılmış olmak üzere iki günlük modeli destekler.

Merkezi günlük modeli

Merkezi günlük modelinde tek bir MSBuild.exe örneği, derleme görevlerini gerçekleştirmesine yardımcı olmak için merkezi düğümün alt örnekleri ("ikincil düğümler") merkezi düğüme iliştirilmiş "merkezi düğüm" olarak görev yapar.

Merkezi Günlükçü Modeli

Merkezi düğüme bağlanan çeşitli türlerdeki günlüğe kaydedenler "merkezi günlükçüler" olarak bilinir. Merkezi düğüme aynı anda her günlükçü türünün yalnızca bir örneği eklenebilir.

Bir derleme gerçekleştiğinde, ikincil düğümler derleme olaylarını merkezi düğüme yönlendirir. Merkezi düğüm, tüm olaylarını ve ikincil düğümlerin olaylarını ekli merkezi günlükçülerden birine veya daha fazlasına yönlendirir. Ardından günlüğe kaydedenler, gelen verileri temel alan günlük dosyaları oluşturur.

Yalnızca ILogger merkezi günlükçü tarafından uygulanması gerekse de, merkezi günlükçü derlemeye katılan düğüm sayısıyla başlatılacak şekilde de uygulamanızı INodeLogger öneririz. Aşağıdaki yöntem aşırı yüklemesi Initialize , altyapı günlükçü'leri başlatırken çağrılır.

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

Önceden var olan ILoggertüm tabanlı günlükçüler merkezi günlükçüler gibi davranabilir ve derlemeye bağlanabilir. Ancak, çok işlemcili günlük senaryoları ve sıra dışı olaylar için açık destek olmadan yazılan merkezi günlükçüler bir derlemeyi bozabilir veya anlamsız çıkışlar üretebilir.

Dağıtılmış günlük modeli

Merkezi günlük modelinde çok fazla gelen ileti trafiği, örneğin birçok proje aynı anda oluşturulduğunda merkezi düğümü bunaltabilir. Bu, sistem kaynaklarını strese alabilir ve derleme performansını düşürebilir. Bu sorunu kolaylaştırmak için MSBuild dağıtılmış günlük modelini destekler.

Dağıtılmış Günlük Modeli

Dağıtılmış günlük kaydı modeli, iletme günlükçü oluşturmanızı sağlayarak merkezi günlük modelini genişletir.

Günlükçüleri iletme

İletme günlükçü, ikincil düğüme bağlanan ve bu düğümden gelen derleme olaylarını alan bir olay filtresine sahip olan ikincil, basit bir günlükçüdür. Gelen olayları filtreler ve yalnızca belirttiğiniz olayları merkezi düğüme iletir. Bu, merkezi düğüme gönderilen ileti trafiğini azaltır ve genel derleme performansını artırır.

Dağıtılmış günlüğü kullanmanın iki yolu vardır:

  • adlı ConfigurableForwardingLoggerönceden oluşturulmuş iletme günlükçüslerini özelleştirin.

  • Kendi özel iletme günlükçünüzü yazın.

Gereksinimlerinize uyacak şekilde değiştirebilirsiniz ConfigurableForwardingLogger . Bunu yapmak için, MSBuild.exe kullanarak komut satırında günlükçü'leri çağırın ve günlükçüden merkezi düğüme iletmesini istediğiniz derleme olaylarını listeleyin.

Alternatif olarak, özel bir iletme günlükçü oluşturabilirsiniz. Özel bir iletme günlükçü oluşturarak, günlükçü davranışını ince ayarlayabilirsiniz. Ancak, özel iletme günlükçüsü oluşturmak, ConfigurableForwardingLogger'ı özelleştirmekten daha karmaşıktır. arabirimini uygulayarak IForwardingLoggerILoggerbir iletme günlükçüsü oluşturabilirsiniz. Arabirim şu şekilde tanımlanır:

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

Günlükçünüzün önem verdiği bir olayı iletmek için, iletme günlükçünüzdeki arabirimin IEventRedirector yöntemini çağırınForwardEvent. Parametresi olarak uygun BuildEventArgs, veya türevini geçirin. Olaylar daha sonra merkezi günlükçüye iletilir ve orada işlem yapılabilir.

Daha fazla bilgi için bkz . İletme günlükçüleri oluşturma.

Basit dağıtılmış günlük kaydı için ConfigurableForwardingLogger kullanma

Bir veya özel iletme günlükçüsü eklemek ConfigurableForwardingLogger için, MSBuild.exe komut satırı derlemesinde anahtarı (-dlkısaca) kullanın-distributedlogger. Günlükçü türlerinin ve sınıflarının adlarını belirtme biçimi, anahtarla -logger aynıdır, ancak dağıtılmış bir günlükçü her zaman bir yerine iki günlük sınıfına sahiptir: iletme günlükçü ve merkezi günlükçü. Aşağıda XMLForwardingLogger adlı özel bir iletme günlükçüsünün nasıl eklendiğinden bir örnek verilmiştir.

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

Not

Yıldız işareti (*) anahtardaki -dl iki günlükçü adını ayırmalıdır.

ConfigurableForwardingLogger kullanmak, diğer günlükçüleri kullanmaya benzer (derleme günlüklerini alma bölümünde açıklandığı gibi), normal MSBuild günlükçü yerine ConfigurableForwardingLogger günlükçüsünü eklemeniz ve ConfigurableForwardingLogger'ın merkezi düğüme geçirmesini istediğiniz olayları parametre olarak belirtmeniz dışında.

Örneğin, yalnızca bir derleme başladığında ve sona erdiğinde ve bir hata oluştuğunda bildirim almak istiyorsanız , ve ERROREVENT parametrelerini parametre olarak geçirirsiniz.BUILDSTARTEDEVENTBUILDFINISHEDEVENT Birden çok parametre noktalı virgülle ayrılarak geçirilebilir. Yalnızca , BUILDFINISHEDEVENTve ERROREVENT olaylarını iletmek için ConfigurableForwardingLogger'ın nasıl kullanılacağına BUILDSTARTEDEVENTilişkin bir örnek aşağıda verilmiştir.

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

Kullanılabilir ConfigurableForwardingLogger parametrelerinin listesi aşağıdadır.

ConfigurableForwardingLogger Parametreleri
BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
PROJECTSTARTEDEVENT
PROJECTFINISHEDEVENT
TARGETSTARTEDEVENT
TARGETFINISHEDEVENT
TASKSTARTEDEVENT
TASKFINISHEDEVENT
ERROREVENT
WARNINGEVENT
HIGHMESSAGEEVENT
NORMALMESSAGEEVENT
LOWMESSAGEEVENT
CUSTOMEVENT
COMMANDLİNE
PERFORMANCESUMMARY
NOSUMMARY
SHOWCOMMANDLINE