共用方式為


撰寫支援多處理器的記錄工具

MSBuild 利用多個處理器的能力可以減少專案建置時間,但也會增加建置事件記錄的複雜性。 在單一處理器環境中,事件、訊息、警告及錯誤會以可預測的循序方式到達記錄器。 然而,在多處理器環境中,來自不同來源的事件可能會同時到達或順序不一致。

產生二進位日誌(-binlog-bl 開關)並使用 結構化日誌檢視器 檢視它,在很大程度上解決了這個問題。 使用 MSBuild 17.8 版或更新版本時,您也可以嘗試終端機記錄器 (-tl switch) ,在主控台上即時取得更使用者友善的記錄輸出。

針對更一般的解決方案,MSBuild 提供多處理器感知記錄器和記錄模型,可用來建立自訂「轉送記錄器」。

多處理器記錄挑戰

當您在多處理器或多核心系統上建置一或多個專案時,會同時產生所有專案的 MSBuild 組建事件。 大量事件訊息可能會同時到達記錄器,或不按順序到達記錄器。 因為 MSBuild 2.0 記錄器不是設計來處理這種情況,所以它可能會讓記錄器不堪重負,並導致建置時間增加、記錄器輸出不正確,甚至建置中斷。 為了解決這些問題,記錄器可以處理順序不對的事件,並將事件及其來源相關聯。

您可以透過建立自訂轉送記錄器來進一步提高記錄效率。 自訂轉送記錄器可作為篩選器,讓您在建置之前只選擇要監控的事件。 當您使用自訂轉送記錄器時,不需要的事件不會使記錄器不堪重負、使日誌混亂或減慢建置時間。

多處理器記錄模型

為了提供多處理器相關的組建問題,MSBuild 支援兩種記錄模型:集中式和分散式。

中央記錄模型

在中央記錄模型中, MSBuild.exe 的單一實例會做為「中央節點」,而中央節點的子實例 (「次要節點」) 會附加至中央節點,以協助其執行建置工作。

中央記錄器模型

連接到中央節點的各種類型的記錄器稱為“中央記錄器”。每個記錄器類型的一個實例只能同時連接至中央節點。

當建置發生時,次要節點會將其建置事件路由傳送至中央節點。 中央節點會將其所有事件以及次要節點的事件遞送至一或多個連接的中央記錄器。 然後,日誌程式會根據送入資料建立日誌檔。

建議您除了中央記錄器必須實作的 ILogger 外,也實作 INodeLogger ,以便中央記錄器在初始化時考慮參與建置的節點數目。 當引擎初始化記錄器時,會調用方法Initialize的下列多載。

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

任何預先存在ILogger的記錄器都可以充當中心記錄器,並可以附加到建置。 不過,在沒有明確支援多處理器記錄案例和亂序事件的情況下撰寫的中央記錄器可能會中斷建置或產生無意義的輸出。

分散式記錄模型

在中央記錄模型中,過多的傳入訊息流量可能會使中央節點不堪重負,例如,當許多專案同時建置時。 這可能會給系統資源帶來壓力並降低建置效能。 為了緩解此問題,MSBuild 支援分散式記錄模型。

分散式記錄模型

分散式記錄模型可讓您建立轉遞記錄器,以擴充中央記錄模型。

轉發記錄器

轉遞記錄器是次要輕量型記錄器,具有事件過濾器,可連接至次要節點,並從該節點接收傳入的建置事件。 它會過濾送入事件,並僅將您指定的事件轉遞至中央節點。 這可減少傳送至中央節點的訊息流量,並改善整體建置效能。

使用分散式記錄有兩種方式,如下所示:

您可以修改 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或自訂轉送記錄器,請在 -distributedlogger-dl 命令列組建中使用交換器(簡稱)。 指定記錄器類型和類別名稱的格式與交換器的格式 -logger 相同,不同之處在於分散式記錄器始終具有兩個日誌記錄類別,而不是一個,即轉發日誌記錄器和中央日誌記錄器。 以下是如何附加名為 XMLForwardingLogger 的自訂轉送記錄器。

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

備註

星號(*)必須分隔 -dl 切換中的兩個記錄器名稱。

使用 ConfigurableForwardingLogger 的方式就像使用其他記錄器一樣(如 取得組建記錄中所述),只不過您需要附加 ConfigurableForwardingLogger 記錄器,而不是一般的 MSBuild 記錄器,並且將您希望 ConfigurableForwardingLogger 傳遞至中央節點的事件指定為參數。

例如,如果您只想在建置開始和結束時收到通知,以及發生錯誤時,您可以傳遞 BUILDSTARTEDEVENTBUILDFINISHEDEVENTERROREVENT 作為參數。 多個參數可以透過用分號分隔來傳遞。 以下是如何使用 ConfigurableForwardingLogger 僅轉送 BUILDSTARTEDEVENTBUILDFINISHEDEVENTERROREVENT 事件的範例。

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

以下是可用的 ConfigurableForwardingLogger 參數清單。

ConfigurableForwardingLogger 參數
BUILDSTARTED事件
BUILDFINISHED事件
PROJECTSTARTED事件
PROJECTFINISHEDEVENT事件
TARGETSTARTED事件
TARGETFINISHEDEVENT
TASKSTARTED事件
TASK_FINISHED事件
ERROR事件
WARNING事件
HIGHMESSAGE事件
NORMALMESSAGE事件
LOWMESSAGE事件
自訂事件
命令行
性能摘要
無摘要
SHOW命令行