次の方法で共有


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

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

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

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

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

Bb383987.collapse_all(ja-jp,VS.110).gif中央ログ モデル

マルチプロセッサ ビルドの場合、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);
}

Bb383987.collapse_all(ja-jp,VS.110).gif分散ログ モデル

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

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

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

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

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

詳細については、「転送 logger の作成」を参照してください。

Bb383987.collapse_all(ja-jp,VS.110).gif分散 logger のアタッチ

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

C:\ WINDOWS\Microsoft.NET\Framework\v3.5.20301>msbuild.exe *.proj 
/distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,
Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,
Culture=neutral

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

参照

概念

ビルド ロガー

転送 logger の作成