マルチプロセッサ環境でのログ

MSBuild では複数のプロセッサを使用できるため、プロジェクトのビルド時間が大幅に短縮されますが、同時にログの複雑性も高まります。 シングルプロセッサ環境であれば、logger は、イベント、メッセージ、警告、およびエラーを順序に従った予測可能な方法で処理できます。 それに対し、マルチプロセッサ環境では、イベントが複数のソースから同時に、または誤った順序で送られてくることがあります。 MSBuild は、新しいマルチ マルチプロセッサ対応の logger を提供し、カスタム「転送 logger」を作成できます。

マルチプロセッサ ビルドのログ

1 つ以上のプロジェクトをマルチプロセッサ システムまたはマルチコア システムでビルドすると、すべてのプロジェクトの MSBuild ビルド イベントが同時に生成されます。 大量のイベント データは、同時に、または誤った順序 logger にくる可能性があります。 これはビルド時間の増加や不正確な logger 出力も、ビルドが破損の原因し、logger の過です。 これらの問題に対処するには、MSBuild の logger はシーケンスのイベントを処理し、イベントとそのソースを関連付けます。

カスタム転送 logger を作成すると、ログの効率をさらに高めることができます。 カスタム転送 logger はフィルターの役割を果たし、ビルドを開始する前に監視の対象とするイベントを選択できます。 カスタム転送 logger を使用すると、不要なイベントが除外されるため、logger の過負荷、ログの煩雑化、ビルド時間の増加を防ぐことができます。

中央ログ モデル

マルチプロセッサ ビルドの場合、MSBuild では "中央ログ モデル" が使用されます。 中央ログ モデルでは、MSBuild.exe のインスタンスがプライマリ ビルド プロセスの役割を果たします。これを "中央ノード" といいます。 中央ノードには、MSBuild.exe のセカンダリ インスタンスがアタッチされます。これを "セカンダリ ノード" といいます。 中央ノードにアタッチされる ILogger ベースの logger を "中央 logger" と呼び、セカンダリ ノードにアタッチされる logger を "セカンダリ logger" と呼びます。

ビルドを開始すると、セカンダリ logger がイベント トラフィックを中央 logger にルーティングします。 イベントは複数のセカンダリ ノードで発生するため、イベント データは同時に中央ノードに到着しますが、インタリーブされます。 イベントとプロジェクト間の参照やイベントとターゲット間の参照を解決するために、イベント引数には追加のビルド イベント コンテキスト情報が含まれています。

中央 logger による実装が必要なのは ILogger だけですが、中央 logger をビルドに参加するノードの数で初期化する場合は、INodeLogger も実装することをお勧めします。 エンジンが logger を初期化するときには、次のような Initialize メソッドのオーバーロードが呼び出されます。

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

分散ログ モデル

中央ログ モデルでは、一度に多数のプロジェクトをビルドする場合など、大量の受信メッセージ トラフィックの発生により、中央ノードが過負荷となることがあり、それがシステムの負担を増大させ、ビルド パフォーマンスの低下につながります。

この問題を軽減するために、MSBuild は転送 logger の作成によって中央ログ モデルを拡張する "分散ログ モデル" にも対応しています。 転送 logger はセカンダリ ノードにアタッチされ、このノードで生成されるビルド イベントを受け取ります。 転送 logger が通常の logger と異なる点は、イベントをフィルター処理して必要なイベントだけを中央ノードに転送できることです。 これにより、中央ノードへのメッセージ トラフィックが減少するため、パフォーマンスが向上します。

転送 logger を作成するには、IForwardingLogger の派生インターフェイスである ILogger を実装します。 このインターフェイスは次のように定義されます。

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

転送 logger 内のイベントを転送するには、ForwardEvent インターフェイスの IEventRedirector メソッドを呼び出します。 パラメーターとして、適切な BuildEventArgs または派生クラスを渡します。

詳細については、次を参照してください。転送 Logger を作成するです。

分散 logger のアタッチ

コマンド ラインでのビルドで分散 logger をアタッチするには、/distributedlogger (短縮形は /dl) スイッチを使用します。 logger の型名およびクラス名の形式は、/logger スイッチの場合と同じです。ただし、分散 logger は転送 logger と中央 logger という 2 つのログ記録クラスから成ります。 分散 logger をアタッチするコードの例を次に示します。

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

/dl スイッチでは、2 つの logger 名をアスタリスク (*) で区切っています。

関連項目

ビルド ロガー
転送 logger の作成