Ç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 (-binlog
veya -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 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 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 IForwardingLogger ILoggerbir 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ı (-dl
kı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.BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
Birden çok parametre noktalı virgülle ayrılarak geçirilebilir. Yalnızca , BUILDFINISHEDEVENT
ve ERROREVENT
olaylarını iletmek için ConfigurableForwardingLogger'ın nasıl kullanılacağına BUILDSTARTEDEVENT
iliş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 |