マルチプロセッサ環境でのログLogging in a Multi-Processor Environment

MSBuild では複数のプロセッサを使用できるため、プロジェクトのビルド時間が大幅に短縮されますが、同時にログの複雑性も高まります。The ability of MSBuild to use multiple processors can greatly decrease project building time, but it also adds complexity to logging. シングルプロセッサ環境であれば、logger は、イベント、メッセージ、警告、およびエラーを順序に従った予測可能な方法で処理できます。In a single-processor environment, the logger can handle incoming events, messages, warnings, and errors in a predictable, sequential manner. それに対し、マルチプロセッサ環境では、イベントが複数のソースから同時に、または誤った順序で送られてくることがあります。However, in a multi-processor environment, events from several sources can arrive simultaneously or out of sequence. MSBuild には、マルチプロセッサ対応の新しい logger が用意されており、カスタム "転送 logger" を作成できます。MSBuild provides a new multi-processor-aware logger and enables the creation of custom "forwarding loggers."

マルチプロセッサ ビルドのログLogging Multiple-Processor Builds

1 つ以上のプロジェクトをマルチプロセッサ システムまたはマルチコア システムでビルドすると、すべてのプロジェクトの MSBuild ビルド イベントが同時に生成されます。When you build one or more projects in a multi-processor or multi-core system, MSBuild build events for all the projects are generated simultaneously. 大量のイベント データが同時に、または誤った順序で logger に送られてくる可能性があります。An avalanche of event data may arrive at the logger at the same time or out of sequence. これにより、logger が過負荷となり、ビルド時間の増加や不正確な logger 出力をもたらすだけでなく、ビルドが破損することもあります。This can overwhelm the logger and cause increased build times, incorrect logger output, or even a broken build. これらの問題を解決するために、MSBuild の logger は順序が誤っているイベントを処理し、イベントとそのソースを関連付けます。To address these issues, the MSBuild logger can process out-of-sequence events and correlate events and their sources.

カスタム転送 logger を作成すると、ログの効率をさらに高めることができます。You can improve logging efficiency even more by creating a custom forwarding logger. カスタム転送 logger はフィルターの役割を果たし、ビルドを開始する前に監視の対象とするイベントを選択できます。A custom-forwarding logger acts as a filter by letting you choose, before you build, the events you want to monitor. カスタム転送 logger を使用すると、不要なイベントが除外されるため、logger の過負荷、ログの煩雑化、ビルド時間の増加を防ぐことができます。When you use a custom forwarding logger, unwanted events do not overwhelm the logger, clutter your logs, or slow build times.

中央ログ モデルCentral Logging Model

マルチプロセッサ ビルドの場合、MSBuild では "中央ログ モデル" が使用されます。For multi-processor builds, MSBuild uses a "central logging model." 中央ログ モデルでは、MSBuild.exe のインスタンスがプライマリ ビルド プロセスの役割を果たします。これを "中央ノード" といいます。In the central logging model, an instance of MSBuild.exe acts as the primary build process, or "central node." 中央ノードには、MSBuild.exe のセカンダリ インスタンスがアタッチされます。これを "セカンダリ ノード" といいます。Secondary instances of MSBuild.exe, or "secondary nodes," are attached to the central node. 中央ノードにアタッチされる ILogger ベースの logger を "中央 logger" と呼び、セカンダリ ノードにアタッチされる logger を "セカンダリ logger" と呼びます。Any ILogger-based loggers attached to the central node are known as "central loggers" and loggers attached to secondary nodes are known as "secondary loggers."

ビルドを開始すると、セカンダリ logger がイベント トラフィックを中央 logger にルーティングします。When a build occurs, the secondary loggers route their event traffic to the central loggers. イベントは複数のセカンダリ ノードで発生するため、イベント データは同時に中央ノードに到着しますが、インタリーブされます。Because events originate at several secondary nodes, the data arrives at the central node simultaneously but interleaved. イベントとプロジェクト間の参照やイベントとターゲット間の参照を解決するために、イベント引数には追加のビルド イベント コンテキスト情報が含まれています。To resolve event-to-project and event-to-target references, the event arguments include additional build event context information.

中央 logger による実装が必要なのは <xref:Microsoft.Build.Framework.ILogger> だけですが、中央 logger をビルドに参加するノードの数で初期化する場合は、<xref:Microsoft.Build.Framework.INodeLogger> も実装することをお勧めします。Although only <xref:Microsoft.Build.Framework.ILogger> is required to be implemented by the central logger, we recommend that you also implement <xref:Microsoft.Build.Framework.INodeLogger> if you want the central logger to initialize with the number of nodes that are participating in the build. エンジンが logger を初期化するときには、次のような <xref:Microsoft.Build.Framework.ILogger.Initialize%2A> メソッドのオーバーロードが呼び出されます。The following overload of the <xref:Microsoft.Build.Framework.ILogger.Initialize%2A> method is invoked when the engine initializes the logger:

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

分散ログ モデルDistributed Logging Model

中央ログ モデルでは、一度に多数のプロジェクトをビルドする場合など、大量の受信メッセージ トラフィックの発生により、中央ノードが過負荷となることがあり、それがシステムの負担を増大させ、ビルド パフォーマンスの低下につながります。In the central logging model, too much incoming message traffic, such as when many projects build at once, can overwhelm the central node, which stresses the system and lowers build performance.

この問題を軽減するために、MSBuild は転送 logger の作成によって中央ログ モデルを拡張する "分散ログ モデル" にも対応しています。To reduce this problem, MSBuild also enables a "distributed logging model" that extends the central logging model by letting you create forwarding loggers. 転送 logger はセカンダリ ノードにアタッチされ、このノードで生成されるビルド イベントを受け取ります。A forwarding logger is attached to a secondary node and receives incoming build events from that node. 転送 logger が通常の logger と異なる点は、イベントをフィルター処理して必要なイベントだけを中央ノードに転送できることです。The forwarding logger is just like a regular logger except that it can filter the events and then forward only the desired ones to the central node. これにより、中央ノードへのメッセージ トラフィックが減少するため、パフォーマンスが向上します。This reduces the message traffic at the central node and therefore enables better performance.

転送 logger を作成するには、<xref:Microsoft.Build.Framework.IForwardingLogger> の派生インターフェイスである <xref:Microsoft.Build.Framework.ILogger> を実装します。You can create a forwarding logger by implementing the <xref:Microsoft.Build.Framework.IForwardingLogger> interface, which derives from <xref:Microsoft.Build.Framework.ILogger>. このインターフェイスは次のように定義されます。The interface is defined as:

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

転送 logger 内のイベントを転送するには、<xref:Microsoft.Build.Framework.IEventRedirector.ForwardEvent%2A> インターフェイスの <xref:Microsoft.Build.Framework.IEventRedirector> メソッドを呼び出します。To forward events in a forwarding logger, call the <xref:Microsoft.Build.Framework.IEventRedirector.ForwardEvent%2A> method of the <xref:Microsoft.Build.Framework.IEventRedirector> interface. パラメーターとして、適切な <xref:Microsoft.Build.Framework.BuildEventArgs> または派生クラスを渡します。Pass the appropriate <xref:Microsoft.Build.Framework.BuildEventArgs>, or a derivative, as the parameter.

詳細については、「転送 logger の作成」を参照してください。For more information, see Creating Forwarding Loggers.

分散 logger のアタッチAttaching a Distributed Logger

コマンド ラインでのビルドで分散 logger をアタッチするには、/distributedlogger (短縮形は /dl) スイッチを使用します。To attaching a distributed logger on a command line build, use the /distributedlogger (or, /dl for short) switch. logger の型名およびクラス名の形式は、/logger スイッチの場合と同じです。ただし、分散 logger は転送 logger と中央 logger という 2 つのログ記録クラスから成ります。The format for specifying the names of the logger types and classes are the same as those for the /logger switch, except that a distributed logger is comprised of two logging classes: a forwarding logger and a central logger. 分散 logger をアタッチするコードの例を次に示します。Following is an example of attaching a distributed logger:

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

/dl スイッチでは、2 つの logger 名をアスタリスク () で区切っています。An asterisk () separates the two logger names in the /dl switch.

参照See Also

ビルド ロガー Build Loggers
転送ロガーの作成Creating Forwarding Loggers