MSBuild가 여러 프로세서를 활용하는 기능은 프로젝트 빌드 시간을 줄일 수 있지만 이벤트 로깅을 빌드하는 데 복잡성을 더합니다. 단일 프로세서 환경에서 이벤트, 메시지, 경고 및 오류는 예측 가능하고 순차적인 방식으로 로거에 도착합니다. 그러나 다중 프로세서 환경에서는 서로 다른 소스의 이벤트가 동시에 도착하거나 순서가 어긋나게 도착할 수 있습니다.
이진 로그(-binlog 또는 -bl 스위치)를 생성하고 구조화된 로그 뷰어 로 확인하면 이 문제가 크게 해결됩니다. MSBuild 버전 17.8 이상을 사용하면 콘솔에서 실시간으로 사용자 친화적인 로깅 출력을 위해 터미널 로거(-tl 스위치)를 사용해 볼 수도 있습니다.
보다 일반적인 솔루션을 위해 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를 사용자 지정합니다.
사용자 고유의 사용자 지정 전달 로거를 작성합니다.
요구 사항에 맞게 수정 ConfigurableForwardingLogger 할 수 있습니다. 이렇게 하려면 MSBuild.exe사용하여 명령줄에서 로거를 호출하고 로거가 중앙 노드로 전달할 빌드 이벤트를 나열합니다.
또는 사용자 지정 전달 로거를 만들 수 있습니다. 사용자 지정 전달 로거를 만들어 로거의 동작을 미세 조정할 수 있습니다. 그러나 사용자 지정 전달 로거를 만드는 것은 ConfigurableForwardingLogger를 사용자 지정하는 것보다 더 복잡합니다. 에서 파생되는 ILogger 인터페이스를 구현하여 IForwardingLogger 전달 로거를 생성할 수 있습니다. 인터페이스는 다음과 같이 정의됩니다.
public interface IForwardingLogger: INodeLogger
{
public IEventRedirector EventRedirector { get; set; }
public int NodeId { get; set; }
}
로거가 관심 있는 이벤트를 전달하려면 전달 로거에서 인터페이스의 ForwardEvent 메서드를 호출 IEventRedirector 합니다. 적절한 BuildEventArgs파생을 매개 변수로 전달합니다. 그러면 이벤트가 중앙 로거로 전달되고 해당 로거에서 동작할 수 있습니다.
자세한 내용은 전달 로거 만들기를 참조하세요.
간단한 분산 로깅에 ConfigurableForwardingLogger 사용
사용자 정의 포워딩 로거 또는 ConfigurableForwardingLogger를 연결하려면 MSBuild.exe 명령줄 빌드에서 -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 일반적인 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 |
| TASKSTARTEDEVENT |
| 작업완료이벤트 |
| ERROREVENT |
| WARNINGEVENT |
| HIGHMESSAGEEVENT |
| 노멀메시지이벤트 |
| LOWMESSAGEEVENT |
| CUSTOMEVENT |
| 커맨드라인 |
| 성능 요약 |
| NOSUMMARY |
| SHOWCOMMANDLINE (명령줄 표시) |