다중 프로세서 인식 로거 작성Writing Multi-Processor-Aware Loggers

MSBuildMSBuild에서는 다중 프로세서를 사용할 수 있기 때문에 프로젝트 빌드 시간을 줄일 수 있는 반면 이벤트 로깅 빌드 과정이 복잡해집니다.The ability of MSBuildMSBuild to take advantage of multiple processors can decrease project building time, but it also adds complexity to build event logging. 단일 프로세서 환경에서 이벤트, 메시지, 경고 및 오류는 예측 가능하고 순차적인 방식으로 로거에 도착합니다.In a single-processor environment, events, messages, warnings, and errors arrive at the logger in a predictable, sequential manner. 그러나 다중 프로세서 환경에서 여러 원본의 이벤트는 동시에 또는 순서 없이 도착할 수 있습니다.However, in a multi-processor environment, events from different sources can arrive at the same time or out of sequence. 이러한 문제를 방지하기 위해 MSBuildMSBuild에서는 다중 프로세서 인식 로거와 새 로깅 모델이 제공되며, 사용자 지정 "전달 로거"를 만들 수 있습니다.To provide for this, MSBuildMSBuild provides a multi-processor-aware logger and a new logging model, and lets you create custom "forwarding loggers."

다중 프로세서 로깅 문제Multi-Processor Logging Challenges

다중 프로세서 또는 다중 핵심 프로세서에서 하나 이상의 프로젝트를 빌드하면 모든 프로젝트에 대한 MSBuildMSBuild 빌드 이벤트가 동시에 생성됩니다.When you build one or more projects on a multi-processor or multi-core system, MSBuildMSBuild build events for all the projects are generated at the same time. 따라서 많은 이벤트 메시지가 로거에 동시에 또는 순서 없이 도착할 수 있습니다.An avalanche of event messages may arrive at the logger at the same time or out of sequence. MSBuildMSBuild 2.0 로거는 이 상황을 처리하도록 설계되지 않았으므로 로거에 과부하가 걸리고 빌드 시간이 늘어나거나 로거 출력이 잘못되거나 심지어 빌드가 손상될 수 있습니다.Because a MSBuildMSBuild 2.0 logger is not designed to handle this situation, it can overwhelm the logger and cause increased build times, incorrect logger output, or even a broken build. 이러한 문제를 해결하기 위해 로거(MSBuildMSBuild 3.5부터 시작)를 사용하면 순서 없는 이벤트를 처리하고 이벤트와 해당 소스를 서로 연결할 수 있습니다.To address these issues, the logger (starting in MSBuildMSBuild 3.5) 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, only the events you want to monitor. 사용자 지정 전달 로거를 사용하여 원하지 않는 이벤트는 로거에 과부하가 걸리지 않도록 하고, 로그를 복잡하게 하거나 빌드 시간을 느리게 하지 않을 수 있습니다.When you use a custom forwarding logger, unwanted events cannot overwhelm the logger, clutter your logs, or slow build times.

다중 프로세서 로깅 모델Multi-Processor Logging Models

다중 프로세서 관련 빌드 문제를 방지하기 위해 MSBuildMSBuild에서는 두 개의 로깅 모델, 중앙 로깅 모델 및 분산 로깅 모델을 지원합니다.To provide for multi-processor-related build issues, MSBuildMSBuild supports two logging models, central and distributed.

중앙 로깅 모델Central Logging Model

중앙 로깅 모델에서 MSBuild.exe의 단일 인스턴스는 "중앙 노드"의 역할을 하며 중앙 노드의 자식 인스턴스("보조 노드")는 빌드 작업을 수행할 수 있도록 중앙 노드에 연결합니다.In the central logging model, a single instance of MSBuild.exe acts as the "central node," and child instances of the central node ("secondary nodes") attach to the central node to help it perform build tasks.

중앙 로거 모델Central Logger Model

중앙 노드에 연결하는 다양한 종류의 로거는 "중앙 로거"라고 합니다.Loggers of various types that attach to the central node are known as "central loggers." 각 로거 형식의 인스턴스 하나만 중앙 노드에 동시에 연결될 수 있습니다.Only one instance of each logger type can be attached to the central node at the same time.

빌드가 발생하면 보조 노드는 해당 빌드 이벤트를 중앙 노드에 라우팅합니다.When a build occurs, the secondary nodes route their build events to the central node. 중앙 노드는 모든 이벤트뿐 아니라 보조 노드를 하나 이상의 연결된 중앙 로거에 라우팅합니다.The central node routes all its events, and also those of the secondary nodes, to one or more of the attached central loggers. 그런 다음 로거는 들어오는 데이터를 기반으로 하는 로그 파일을 만듭니다.The loggers then create log files that are based on the incoming data.

<xref:Microsoft.Build.Framework.ILogger>는 중앙 로거에 의해 구현되어야 하지만 중앙 로거에서 빌드에 참여하는 노드 수로 초기화할 수 있도록 <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> so that the central logger initializes with the number of nodes that are participating in the build. 다음 <xref:Microsoft.Build.Framework.ILogger.Initialize%2A> 메서드의 오버로드는 엔진이 로거를 초기화할 때 호출됩니다.The following overload of the <xref:Microsoft.Build.Framework.ILogger.Initialize%2A> method invokes when the engine initializes the logger.

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

기존 <xref:Microsoft.Build.Framework.ILogger> 기반 로거는 중앙 로거의 역할을 할 수 있으며 빌드에 연결할 수 있습니다.Any pre-existing <xref:Microsoft.Build.Framework.ILogger>-based loggers can act as central loggers and can attach to the build. 그러나 다중 프로세서 로깅 시나리오 및 비순차 이벤트에 대한 명시적 지원 없이 작성된 중앙 로거는 빌드를 손상시키거나 의미 없는 출력을 생성할 수 있습니다.However, central loggers written without explicit support for multi-processor logging scenarios and out-of-order events may break a build or produce meaningless output.

분산 로깅 모델Distributed Logging Model

중앙 로깅 모델에서 너무 많이 들어오는 메시지 트래픽은 중앙 노드에 과부하를 줄 수 있습니다. 예를 들어 많은 프로젝트가 동시에 빌드되는 경우입니다.In the central logging model, too much incoming message traffic can overwhelm the central node, for example, when many projects build at the same time. 시스템 리소스에 과부하가 걸리고 빌드 성능이 저하될 수 있습니다.This can stress system resources and decrease build performance. 이러한 문제를 해결하기 위해 MSBuildMSBuild에서는 분산 로깅 모델을 지원합니다.To ease this problem, MSBuildMSBuild supports a distributed logging model.

분산 로깅 모델Distributed Logging Model

분산 로깅 모델은 전달 로거를 만들 수 있도록 하여 중앙 로깅 모델을 확장합니다.The distributed logging model extends the central logging model by letting you create a forwarding logger.

전달 로거Forwarding Loggers

전달 로거는 보조 노드에 연결하고 해당 노드에서 들어오는 빌드 이벤트를 수신하는 이벤트 필터가 있는 보조, 경량 로거입니다.A forwarding logger is a secondary, lightweight logger that has an event filter that attaches to a secondary node and receives incoming build events from that node. 들어오는 이벤트를 필터링하고 중앙 노드로 지정하는 이벤트만 전달합니다.It filters the incoming events and forwards only the ones that you specify to the central node. 이렇게 하면 중앙 노드로 전송되는 메시지 트래픽을 줄이고 전반적인 빌드 성능을 향상시킵니다.This reduces the message traffic that is sent to the central node and improves overall build performance.

다음과 같이 분산 로깅을 사용하는 방법은 두 가지가 있습니다.There are two ways to use distributed logging, as follows:

  • <xref:Microsoft.Build.BuildEngine.ConfigurableForwardingLogger>라는 미리 작성된 전달 로거를 사용자 지정합니다.Customize the pre-fabricated forwarding logger named <xref:Microsoft.Build.BuildEngine.ConfigurableForwardingLogger>.

  • 사용자 고유의 사용자 지정 전달 로거를 작성합니다.Write your own custom forwarding logger.

    요구 사항에 맞게 ConfigurableForwardingLogger를 수정할 수 있습니다.You can modify ConfigurableForwardingLogger to suit your requirements. 이렇게 하려면 MSBuild.exe를 사용하여 명령줄에서 로거를 호출하고 로거에서 중앙 노드로 전달하려는 빌드 이벤트를 나열합니다.To do this, call the logger on the command line by using MSBuild.exe, and list the build events that you want the logger to forward to the central node.

    대신 사용자 지정 전달 로거를 만들 수 있습니다.As an alternative, you can create a custom forwarding logger. 사용자 지정 전달 로거를 만들어 로거의 동작을 미세 조정할 수 있습니다.By creating a custom forwarding logger, you can fine-tune the behavior of the logger. 그러나 사용자 지정 전달 로거를 만드는 것은 ConfigurableForwardingLogger를 사용자 지정하는 것보다 더 복잡합니다.However, creating a custom forwarding logger is more complex than just customizing the ConfigurableForwardingLogger. 자세한 내용은 전달 로거 만들기를 참조하세요.For more information, see Creating Forwarding Loggers.

단순 분산 로깅에 ConfigurableForwardingLogger 사용Using the ConfigurableForwardingLogger for Simple Distributed Logging

ConfigurableForwardingLogger 또는 사용자 지정 전달 로거를 연결하려면 MSBuild.exe 명령줄 빌드에서 /distributedlogger 스위치(간단하게 /dl)를 사용합니다.To attach either a ConfigurableForwardingLogger or a custom forwarding logger, use the /distributedlogger switch (/dl for short) in an MSBuild.exe command-line build. 로거 형식 및 클래스의 이름을 지정하기 위한 형식은 분산 로거가 항상 하나 대신 두 개의 로깅 클래스(전달 로거 및 중앙 로거)를 가진 것을 제외하고 /logger 스위치에 대한 것과 동일합니다.The format for specifying the names of the logger types and classes is the same as that for the /logger switch, except that a distributed logger always has two logging classes instead of one, the forwarding logger and the central logger. 다음은 XMLForwardingLogger라는 사용자 지정 전달 로거를 연결하는 방법의 예입니다.The following is an example of how to attach a custom forwarding logger named XMLForwardingLogger.

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

참고

별표()는 /dl 스위치에서 두 개의 로거 이름을 구분해야 합니다.An asterisk () must separate the two logger names in the /dl switch.

ConfigurableForwardingLogger를 사용하는 것은 일반 MSBuildMSBuild 로거 대신 ConfigurableForwardingLogger 로거를 연결하고 매개 변수로 ConfigurableForwardingLogger에서 중앙 노드에 전달하려는 이벤트를 지정하는 것을 제외하고 다른 로거를 사용하는 것과 비슷합니다(빌드 로그 가져오기에 설명된 대로).Using the ConfigurableForwardingLogger is like using any other logger (as outlined in Obtaining Build Logs), except that you attach the ConfigurableForwardingLogger logger instead of the typical MSBuildMSBuild logger and you specify as parameters the events that you want the ConfigurableForwardingLogger to pass on to the central node.

예를 들어 빌드가 시작하거나 끝날 때 및 오류가 발생할 때 알림을 받으려는 경우 매개 변수로 BUILDSTARTEDEVENT, BUILDFINISHEDEVENTERROREVENT를 전달합니다.For example, if you want to be notified only when a build starts and ends, and when an error occurs, you would pass BUILDSTARTEDEVENT, BUILDFINISHEDEVENT, and ERROREVENT as parameters. 세미콜론으로 구분하여 여러 매개 변수를 전달할 수 있습니다.Multiple parameters can be passed by separating them with semi-colons. 다음은 ConfigurableForwardingLogger를 사용하여 BUILDSTARTEDEVENT, BUILDFINISHEDEVENTERROREVENT 이벤트만 전달하는 방법의 예입니다.The following is an example of how to use the ConfigurableForwardingLogger to forward only the BUILDSTARTEDEVENT, BUILDFINISHEDEVENT, and ERROREVENT events.

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

다음은 사용 가능한 ConfigurableForwardingLogger 매개 변수 목록입니다.The following is a list of the available ConfigurableForwardingLogger parameters.

ConfigurableForwardingLogger 매개 변수ConfigurableForwardingLogger Parameters
BUILDSTARTEDEVENTBUILDSTARTEDEVENT
BUILDFINISHEDEVENTBUILDFINISHEDEVENT
PROJECTSTARTEDEVENTPROJECTSTARTEDEVENT
PROJECTFINISHEDEVENTPROJECTFINISHEDEVENT
TARGETSTARTEDEVENTTARGETSTARTEDEVENT
TARGETFINISHEDEVENTTARGETFINISHEDEVENT
TASKSTARTEDEVENTTASKSTARTEDEVENT
TASKFINISHEDEVENTTASKFINISHEDEVENT
ERROREVENTERROREVENT
WARNINGEVENTWARNINGEVENT
HIGHMESSAGEEVENTHIGHMESSAGEEVENT
NORMALMESSAGEEVENTNORMALMESSAGEEVENT
LOWMESSAGEEVENTLOWMESSAGEEVENT
CUSTOMEVENTCUSTOMEVENT
COMMANDLINECOMMANDLINE
PERFORMANCESUMMARYPERFORMANCESUMMARY
NOSUMMARYNOSUMMARY
SHOWCOMMANDLINESHOWCOMMANDLINE

참고 항목See Also

전달 로거 만들기Creating Forwarding Loggers