MSBuild で複数のプロセッサを利用する機能により、プロジェクトのビルド時間が短縮されますが、イベント ログの作成も複雑になります。 単一プロセッサ環境では、イベント、メッセージ、警告、およびエラーが、予測可能な順番にロガーに到着します。 ただし、マルチプロセッサ環境では、異なるソースからのイベントが同時に到着したり、順序が異なったりする可能性があります。
バイナリ ログ (-binlog または -bl スイッチ) を生成し、 構造化されたログ ビューアー で表示すると、この問題が主に解決されます。 MSBuild バージョン 17.8 以降では、ターミナル ロガー (-tl スイッチ) を試して、コンソールでリアルタイムでよりわかりやすいログ出力を得ることもできます。
より一般的なソリューションとして、MSBuild にはマルチプロセッサ対応のロガーと、カスタムの "転送ロガー" の作成に使用できるログ モデルが用意されています。
マルチプロセッサログ管理の課題
マルチプロセッサまたはマルチコア システムで 1 つ以上のプロジェクトをビルドすると、すべてのプロジェクトの MSBuild ビルド イベントが同時に生成されます。 大量のイベントメッセージが同時に、または順序が乱れてロガーに到着する場合があります。 MSBuild 2.0 ロガーはこのような状況を処理するように設計されていないため、ロガーが過剰になり、ビルド時間の増加、ロガー出力の間違い、またはビルドの破損が発生する可能性があります。 これらの問題に対処するために、ロガーはシーケンス外のイベントを処理し、イベントとそのソースを関連付けることができます。
カスタム転送ロガーを作成することで、ログ記録の効率をさらに向上させることができます。 カスタム転送ロガーは、ビルド前に監視するイベントのみを選択できるようにすることで、フィルターとして機能します。 カスタム転送ロガーを使用する場合、不要なイベントがロガーを圧倒したり、ログを乱雑にしたり、ビルド時間が遅くなったりすることはできません。
マルチプロセッサ ログ モデル
マルチプロセッサ関連のビルドの問題を提供するために、MSBuild では、中央および分散型の 2 つのログ モデルがサポートされています。
中央ログ モデル
中央ログ モデルでは、 MSBuild.exe の 1 つのインスタンスが "中央ノード" として機能し、中央ノード ("セカンダリ ノード") の子インスタンスが中央ノードにアタッチされ、ビルド タスクの実行に役立ちます。
中央ノードに接続するさまざまな種類のロガーは、"中央ロガー" と呼ばれます。中央ノードに同時にアタッチできるのは、各ロガーの種類のインスタンスが 1 つだけです。
ビルドが発生すると、セカンダリ ノードはビルド イベントを中央ノードにルーティングします。 中央ノードは、すべてのイベントとセカンダリ ノードのイベントを、接続されている 1 つ以上の中央ロガーにルーティングします。 その後、ロガーは、受信データに基づくログ ファイルを作成します。
中央ロガーによって実装する必要があるのは ILogger だけですが、中央ロガーがビルドに参加しているノードの数で初期化されるように、 INodeLogger も実装することをお勧めします。 エンジンがロガーを初期化すると、 Initialize メソッドの次のオーバーロードが呼び出されます。
public interface INodeLogger: ILogger
{
public void Initialize(IEventSource eventSource, int nodeCount);
}
既存の ILogger ベースのロガーは、中央ロガーとして機能し、ビルドにアタッチできます。 ただし、マルチプロセッサ のログ記録シナリオや順序が正しく指定されていないイベントを明示的にサポートせずに記述された中央ロガーは、ビルドを中断したり、意味のない出力を生成したりする可能性があります。
分散ログ モデル
中央ログ モデルでは、受信メッセージ トラフィックが多すぎると、多数のプロジェクトが同時にビルドされた場合など、中央ノードが過剰になる可能性があります。 これにより、システム リソースが負荷を受け、ビルドのパフォーマンスが低下する可能性があります。 この問題を緩和するために、MSBuild では分散ログ モデルがサポートされています。
分散ログ モデルは、転送ロガーを作成できるようにすることで、中央ログ モデルを拡張します。
ロガーの転送
転送ロガーは、セカンダリ ノードにアタッチし、そのノードから受信ビルド イベントを受信するイベント フィルターを持つセカンダリ軽量ロガーです。 受信イベントがフィルター処理され、指定したイベントのみが中央ノードに転送されます。 これにより、中央ノードに送信されるメッセージ トラフィックが減少し、全体的なビルド パフォーマンスが向上します。
分散ログを使用するには、次の 2 つの方法があります。
ConfigurableForwardingLoggerという名前の事前に作成された転送ロガーをカスタマイズします。
独自のカスタム転送ロガーを記述します。
要件に合わせて ConfigurableForwardingLogger を変更できます。 これを行うには、 MSBuild.exeを使用してコマンド ラインでロガーを呼び出し、ロガーが中央ノードに転送するビルド イベントを一覧表示します。
別の方法として、カスタム転送ロガーを作成することもできます。 カスタム転送ロガーを作成することで、ロガーの動作を微調整できます。 ただし、カスタム転送ロガーの作成は、単に ConfigurableForwardingLogger をカスタマイズするよりも複雑です。 IForwardingLoggerから派生するILogger インターフェイスを実装することで、転送ロガーを作成できます。 インターフェイスは次のように定義されます。
public interface IForwardingLogger: INodeLogger
{
public IEventRedirector EventRedirector { get; set; }
public int NodeId { get; set; }
}
ロガーが気にするイベントを転送するには、転送ロガーでForwardEvent インターフェイスのIEventRedirector メソッドを呼び出します。 パラメーターとして適切な BuildEventArgsまたは派生関数を渡します。 その後、イベントは中央ロガーに転送され、そこで処理できます。
詳細については、 転送ロガーの作成を参照してください。
単純な分散ログ記録に ConfigurableForwardingLogger を使用する
ConfigurableForwardingLoggerまたはカスタム転送ロガーをアタッチするには、MSBuild.exeコマンド ライン ビルドで-distributedlogger スイッチ (略して-dl) を使用します。 ロガーの型とクラスの名前を指定する形式は、 -logger スイッチの場合と同じですが、分散ロガーには常に、転送ロガーと中央ロガーの代わりに 2 つのログ クラスがあります。 XMLForwardingLogger という名前のカスタム転送ロガーをアタッチする方法の例を次に示します。
msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,Culture=neutral
注
アスタリスク (*) は、 -dl スイッチの 2 つのロガー名を区切る必要があります。
ConfigurableForwardingLoggerの使用は、一般的な MSBuild ロガーではなく ConfigurableForwardingLogger ロガーをアタッチし、ConfigurableForwardingLogger が中央ノードに渡すイベントをパラメーターとして指定する点を除き、他のロガー (ビルド ログの取得で説明) を使用するのと同じです。
たとえば、ビルドの開始時と終了時にのみ通知を受け取り、エラーが発生した場合は、パラメーターとして BUILDSTARTEDEVENT、 BUILDFINISHEDEVENT、 ERROREVENT を渡します。 複数のパラメーターは、セミコロンで区切ることで渡すことができます。 次に、ConfigurableForwardingLogger を使用して、 BUILDSTARTEDEVENT、 BUILDFINISHEDEVENT、および ERROREVENT イベントのみを転送する方法の例を示します。
msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*ConfigureableForwardingLogger,C:\My.dll;BUILDSTARTEDEVENT; BUILDFINISHEDEVENT;ERROREVENT
使用できる ConfigurableForwardingLogger パラメーターの一覧を次に示します。
| ConfigurableForwardingLogger パラメーター |
|---|
| BUILDSTARTEDEVENT |
| BUILDFINISHEDEVENT |
| PROJECTSTARTEDEVENT |
| PROJECTFINISHEDEVENT |
| TARGETSTARTEDEVENT |
| TARGETFINISHEDEVENT |
| タスク開始イベント |
| タスク終了イベント |
| ERROREVENT |
| 警告イベント |
| HIGHMESSAGEEVENT |
| NORMALMESSAGEEVENT |
| LOWMESSAGEEVENT |
| CUSTOMEVENT |
| コマンドライン |
| パフォーマンスサマリー |
| サマリーなし |
| コマンドラインを表示 |