다중 프로세서 환경에서의 로깅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. 단일 프로세서 환경에서 로거는 예측 가능하고 순차적인 방식으로 들어오는 이벤트, 메시지, 경고 및 오류를 처리할 수 있습니다.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에서는 새 다중 프로세서 인식 로거가 제공되며, 사용자 지정 "전달 로거"를 만들 수 있습니다.MSBuild provides a new multi-processor-aware logger and enables the creation of custom "forwarding loggers."

다중 프로세서 빌드 로깅Logging Multiple-Processor Builds

다중 프로세서 또는 다중 핵심 프로세서에서 하나 이상의 프로젝트를 빌드하면 모든 프로젝트에 대한 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. 따라서 많은 이벤트 데이터가 로거에 동시에 또는 순서 없이 도착할 수 있습니다.An avalanche of event data may arrive at the logger at the same time or out of sequence. 그러면 로거에 과부하가 걸리고 빌드 시간이 늘어나거나 로거 출력이 잘못되거나 심지어 빌드가 손상될 수 있습니다.This can overwhelm the logger and cause increased build times, incorrect logger output, or even a broken build. 이러한 문제를 해결하기 위해 MSBuild 로거를 사용하면 순서 없는 이벤트를 처리하고 이벤트와 해당 소스를 서로 연결할 수 있습니다.To address these issues, the MSBuild logger can process out-of-sequence events and correlate events and their sources.

사용자 지정 전달 로거를 만들어 로깅 효율성을 더욱 향상시킬 수 있습니다.You can improve logging efficiency even more by creating a custom forwarding logger. 사용자 지정 전달 로거는 빌드하기 전에 모니터링하려는 이벤트를 선택하도록 하여 필터의 역할을 합니다.A custom-forwarding logger acts as a filter by letting you choose, before you build, the events you want to monitor. 사용자 지정 전달 로거를 사용하면 원하지 않는 이벤트는 로거에 과부하가 걸리지 않도록 하고, 로그를 복잡하게 하거나 빌드 시간을 느리게 하지 않습니다.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 기반 로거는 "중앙 로거"라고 하며 보조 노드에 연결된 로거는 "보조 로거"라고 합니다.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."

빌드가 발생하면 보조 로거는 중앙 로거로 이벤트 트래픽을 라우팅합니다.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.

ILogger는 중앙 로거에 의해 구현되어야 하지만 중앙 로거에서 빌드에 참여하는 노드 수로 초기화하려는 경우 INodeLogger도 구현하는 것이 좋습니다.Although only ILogger is required to be implemented by the central logger, we recommend that you also implement INodeLogger if you want the central logger to initialize with the number of nodes that are participating in the build. 다음 Initialize 메서드의 오버로드는 엔진이 로거를 초기화할 때 호출됩니다.The following overload of the Initialize 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는 전달 로거를 만들도록 하여 중앙 로깅 모델을 확장하는 "분산된 로깅 모델"을 활성화합니다.To reduce this problem, MSBuild also enables a "distributed logging model" that extends the central logging model by letting you create forwarding loggers. 전달 로거는 보조 노드에 연결되며 해당 노드에서 들어오는 빌드 이벤트를 받습니다.A forwarding logger is attached to a secondary node and receives incoming build events from that node. 전달 로거는 이벤트를 필터링한 다음 중앙 노드에 원하는 이벤트만 전달할 수 있는 것을 제외하고 일반 로거와 동일합니다.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.

ILogger에서 파생된 IForwardingLogger 인터페이스를 구현하여 전달 로거를 만들 수 있습니다.You can create a forwarding logger by implementing the IForwardingLogger interface, which derives from ILogger. 인터페이스는 다음과 같이 정의됩니다.The interface is defined as:

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

전달 로거에서 이벤트를 전달하려면 IEventRedirector 인터페이스의 ForwardEvent 메서드를 호출합니다.To forward events in a forwarding logger, call the ForwardEvent method of the IEventRedirector interface. 매개 변수로 적절한 BuildEventArgs 또는 파생 개체를 전달합니다.Pass the appropriate BuildEventArgs, or a derivative, as the parameter.

자세한 내용은 전달 로거 만들기를 참조하세요.For more information, see Creating Forwarding Loggers.

분산된 로거 연결Attaching a Distributed Logger

명령줄 빌드에서 분산된 로거를 연결하려면 /distributedlogger(또는 간단히 /dl) 스위치를 사용합니다.To attaching a distributed logger on a command line build, use the /distributedlogger (or, /dl for short) switch. 로거 형식 및 클래스의 이름을 지정하기 위한 형식은 분산된 로거가 두 개의 로깅 클래스(전달 로거 및 중앙 로거)로 구성된 것을 제외하고 /logger 스위치에 대한 것과 동일합니다.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. 다음은 분산된 로거 연결의 예입니다.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 스위치에서 두 개의 로거 이름을 구분합니다.An asterisk () separates the two logger names in the /dl switch.

참고 항목See Also

빌드 로거 Build Loggers
전달 로거 만들기Creating Forwarding Loggers