Menulis pencatat sadar-multi-prosesor

Kemampuan MSBuild untuk memanfaatkan beberapa prosesor dapat mengurangi waktu pembangunan proyek, tetapi kemampuan ini juga menambah kompleksitas untuk membangun pengelogan peristiwa. Dalam lingkungan prosesor tunggal, peristiwa, pesan, peringatan, dan kesalahan tiba di pencatat dengan cara yang dapat diprediksi dan berurutan. Namun, dalam lingkungan multi-prosesor, peristiwa dari sumber yang berbeda dapat tiba di saat yang sama atau tidak berurutan.

Menghasilkan log biner (-binlog atau -bl sakelar) dan melihatnya dengan penampil log terstruktur sebagian besar menyelesaikan masalah ini. Dengan MSBuild versi 17.8 atau yang lebih baru, Anda juga dapat mencoba pencatat terminal (-tl switch) untuk output pengelogan yang lebih ramah pengguna secara real time di konsol.

Untuk solusi yang lebih umum, MSBuild menyediakan pencatat sadar multi-prosesor dan model pengelogan yang dapat Anda gunakan untuk membuat "penerusan pencatat" kustom.

Tantangan pengelogan multi-prosesor

Saat Anda membangun satu proyek atau lebih pada sistem multi-prosesor atau multi-inti, peristiwa build MSBuild untuk semua proyek dihasilkan secara bersamaan. Longsoran pesan peristiwa mungkin tiba di pencatat secara bersamaan atau tidak berurutan. Karena pencatat MSBuild 2.0 tidak dirancang untuk menangani situasi ini, pencatat tersebut dapat membuat pencatat kewalahan dan menyebabkan peningkatan waktu build, output pencatat yang salah, atau bahkan build yang rusak. Untuk mengatasi masalah ini, pencatat dapat memproses peristiwa yang tidak berurutan dan menghubungkan peristiwa dan sumbernya.

Anda dapat meningkatkan efisiensi pengelogan lebih banyak lagi dengan membuat pencatat penerusan kustom. Pencatat penerusan kustom bertindak sebagai filter dengan memungkinkan Anda memilih, sebelum membangun, hanya peristiwa yang ingin Anda pantau. Saat Anda menggunakan pencatat penerusan kustom, peristiwa yang tidak diinginkan tidak dapat membebani pencatat, mengacaukan log, atau memperlambat waktu build.

Model pengelogan multi-prosesor

Untuk memenuhi masalah build terkait multi-prosesor, MSBuild mendukung dua model pengelogan, pusat dan terdistribusi.

Model pengelogan pusat

Dalam model pengelogan pusat, satu instans MSBuild.exe bertindak sebagai "node pusat," dan instans elemen turunan dari node pusat ("node sekunder") melekat ke node pusat untuk membantunya menjalankan tugas build.

Central Logger Model

Pencatat dari berbagai jenis yang melekat pada node pusat dikenal sebagai "pencatat pusat." Hanya satu instans dari setiap jenis pencatat yang dapat dilampirkan ke node pusat secara bersamaan.

Saat build terjadi, node sekunder merutekan peristiwa build mereka ke node pusat. Node pusat merutekan semua peristiwanya, dan juga peristiwa node sekunder, ke satu pencatat pusat atau lebih yang melekat. Pencatat kemudian membuat file log yang didasarkan pada data yang masuk.

Meskipun hanya ILogger yang diperlukan untuk diimplementasikan oleh pencatat pusat, kami sarankan Anda juga menerapkan INodeLogger sehingga pencatat pusat menginisialisasi dengan jumlah node yang berpartisipasi dalam build. Kelebihan beban metode Initialize berikut memanggil ketika mesin menginisialisasi pencatat.

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

Setiap pencatat berbasis ILogger yang sudah ada sebelumnya dapat bertindak sebagai pencatat pusat dan dapat melekat ke build. Namun, pencatat pusat yang ditulis tanpa dukungan eksplisit untuk skenario pengelogan multi-prosesor dan peristiwa yang tidak berurutan dapat merusak build atau menghasilkan output yang tidak berarti.

Model pengelogan terdistribusi

Dalam model pengelogan pusat, lalu lintas pesan masuk yang terlalu banyak dapat membuat node pusat kewalahan, misalnya, ketika banyak proyek dibangun di saat yang bersamaan. Hal ini dapat menekan sumber daya sistem dan mengurangi performa build. Untuk meringankan masalah ini, MSBuild mendukung model pengelogan yang terdistribusi.

Model Pengelogan Terdistribusi

Model pengelogan yang terdistribusi memperluas model pengelogan pusat dengan memungkinkan Anda membuat pencatat penerusan.

Pencatat penerusan

Pencatat penerusan adalah pencatat sekunder ringan yang memiliki filter peristiwa yang melekat pada node sekunder dan menerima peristiwa build yang masuk dari node tersebut. Pencatat ini memfilter peristiwa yang masuk dan hanya meneruskan peristiwa yang Anda tentukan ke node pusat. Pencatat ini mengurangi lalu lintas pesan yang dikirim ke node pusat dan meningkatkan keseluruhan performa build.

Ada dua cara untuk menggunakan pengelogan terdistribusi, sebagai berikut:

  • Kustomisasi pencatat penerusan yang telah dibuat sebelumnya yang bernama ConfigurableForwardingLogger.

  • Tulis pencatat penerusan kustom Anda sendiri.

Anda dapat memodifikasi ConfigurableForwardingLogger agar sesuai dengan kebutuhan Anda. Untuk melakukan ini, panggil pencatat di baris perintah menggunakan MSBuild.exe, dan cantumkan peristiwa build yang Anda inginkan untuk diteruskan pencatat ke node pusat.

Sebagai alternatif, Anda dapat membuat pencatat penerusan kustom. Dengan membuat pencatat penerusan kustom, Anda dapat menyempurnakan perilaku pencatat. Namun, membuat pencatat penerusan kustom lebih kompleks daripada hanya mengkustomisasi ConfigurableForwardingLogger. Anda dapat membuat pencatat penerusan dengan mengimplementasikan IForwardingLogger antarmuka, yang berasal dari ILogger. Antarmuka didefinisikan sebagai:

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

Untuk meneruskan peristiwa yang dipedulikan pencatat Anda, panggil ForwardEvent metode IEventRedirector antarmuka di pencatat penerusan Anda. Berikan, atau turunan yang sesuai BuildEventArgs, sebagai parameter. Peristiwa kemudian akan diteruskan ke pencatat pusat dan dapat ditindaklanjuti di sana.

Untuk informasi selengkapnya, lihat Membuat pencatat penerusan.

Menggunakan ConfigurableForwardingLogger untuk pengelogan terdistribusi sederhana

Untuk melampirkan ConfigurableForwardingLogger pencatat penerusan kustom atau , gunakan -distributedlogger sakelar (-dl singkatnya) dalam build baris perintah MSBuild.exe . Format untuk menentukan nama jenis dan kelas pencatat sama dengan yang digunakan untuk sakelar -logger, kecuali bahwa pencatat terdistribusi selalu memiliki dua kelas pengelogan alih-alih satu, pencatat penerusan dan pencatat pusat. Berikut contoh cara melampirkan pencatat penerusan kustom bernama XMLForwardingLogger.

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

Catatan

Tanda bintang (*) harus memisahkan dua nama pencatat dalam sakelar -dl.

ConfigurableForwardingLogger Menggunakan seperti menggunakan pencatat lain (seperti yang diuraikan dalam Mendapatkan log build), kecuali bahwa Anda melampirkan pencatat ConfigurableForwardingLogger alih-alih pencatat MSBuild umum dan Anda menentukan sebagai parameter peristiwa yang Anda inginkan agar ConfigurableForwardingLogger meneruskan ke simpul pusat.

Misalnya, jika Anda ingin diberi tahu hanya saat build dimulai dan berakhir, dan ketika kesalahan terjadi, Anda akan meneruskan BUILDSTARTEDEVENT, BUILDFINISHEDEVENT, dan ERROREVENT sebagai parameter. Beberapa parameter dapat diteruskan dengan memisahkannya dengan titik koma. Berikut contoh cara menggunakan ConfigurableForwardingLogger untuk meneruskan hanya peristiwa BUILDSTARTEDEVENT, BUILDFINISHEDEVENT, dan ERROREVENT.

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

Berikut daftar parameter ConfigurableForwardingLogger yang tersedia.

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