이 항목에서는 다양한 시나리오에 대한 메시지 로깅을 구성하는 방법에 대해 설명합니다.
메시지 로깅 활성화
Windows Communication Foundation(WCF)은 기본적으로 메시지를 기록하지 않습니다. 메시지 로깅을 활성화하려면 추적 원본에 추적 수신기를 System.ServiceModel.MessageLogging
추가하고 구성 파일의 요소에 <messagelogging>
대한 특성을 설정해야 합니다.
다음 예제에서는 로깅을 사용하도록 설정하고 추가 옵션을 지정하는 방법을 보여 줍니다.
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\messages.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>
메시지 로깅 설정에 대한 자세한 내용은 추적 및 메시지 로깅에 대한 권장 설정을 참조하세요.
사용할 수신기의 이름과 형식을 지정하는 데 사용할 add
수 있습니다. 예제 구성에서 수신기의 이름은 "messages"이며 표준 .NET Framework 추적 수신기(System.Diagnostics.XmlWriterTraceListener
)를 사용할 형식으로 추가합니다. 사용하는 System.Diagnostics.XmlWriterTraceListener
경우 구성 파일에서 출력 파일 위치와 이름을 지정해야 합니다. 이 작업은 로그 파일의 이름으로 설정 initializeData
하여 수행됩니다. 그렇지 않으면 시스템에서 예외를 발생시킵니다. 로그를 기본 파일로 내보내는 사용자 지정 수신기를 구현할 수도 있습니다.
비고
메시지 로깅은 디스크 공간에 액세스하므로 특정 서비스에 대해 디스크에 기록되는 메시지 수를 제한해야 합니다. 메시지 제한에 도달하면 정보 수준에서 추적이 생성되고 모든 메시지 로깅 작업이 중지됩니다.
로깅 수준 및 추가 옵션은 로깅 수준 및 옵션 섹션에서 설명합니다.
switchValue
의 source
속성은 추적에만 유효합니다. 추적 원본에 switchValue
대한 System.ServiceModel.MessageLogging
특성을 다음과 같이 지정하면 아무런 효과가 없습니다.
<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
</source>
추적 원본을 사용하지 않도록 설정하려면 logMessagesAtServiceLevel
요소의 logMalformedMessages
, logMessagesAtTransportLevel
, 및 messageLogging
특성을 대신 사용해야 합니다. 이러한 모든 특성을 false
로 설정해야 합니다. 이 작업은 이전 코드 예제의 구성 파일을 사용하거나 구성 편집기 UI 인터페이스를 통해 또는 WMI를 사용하여 수행할 수 있습니다. 구성 편집기 도구에 대한 자세한 내용은 구성 편집기 도구(SvcConfigEditor.exe)를 참조하세요. WMI에 대한 자세한 내용은 진단용 Windows Management Instrumentation 사용을 참조하세요.
로깅 수준 및 옵션
들어오는 메시지의 경우 로깅은 메시지가 형성된 직후, 메시지가 서비스 수준에서 사용자 코드로 전달되기 바로 전, 잘못된 형식의 메시지가 검색될 때 발생합니다.
보내는 메시지의 경우 로깅은 메시지가 사용자 코드로부터 벗어난 직후와 메시지가 연결되기 직전에 발생합니다.
WCF는 서비스와 전송의 두 가지 수준에서 메시지를 기록합니다. 잘못된 형식의 메시지도 기록됩니다. 세 가지 범주는 서로 독립적이며 구성에서 별도로 활성화할 수 있습니다.
logMessagesAtServiceLevel
요소의 logMalformedMessages
, logMessagesAtTransportLevel
, messageLogging
속성을 설정하여 로깅 수준을 제어할 수 있습니다.
서비스 수준
이 계층에 기록된 메시지는 사용자 코드를 입력(수신 시)하거나 나가려고 합니다. 필터가 정의된 경우 필터와 일치하는 메시지만 기록됩니다. 그렇지 않으면 서비스 수준의 모든 메시지가 기록됩니다. 신뢰할 수 있는 메시징 메시지를 제외하고 인프라 메시지(트랜잭션, 피어 채널 및 보안)도 이 수준에서 기록됩니다. 스트리밍된 메시지에서 헤더만 기록됩니다. 또한 보안 메시지는 이 수준에서 암호 해독됩니다.
전송 수준
이 계층에 기록된 메시지는 통신 중 운송을 위해 또는 이후에 인코딩 또는 디코딩할 준비가 된 것입니다. 필터가 정의된 경우 필터와 일치하는 메시지만 기록됩니다. 그렇지 않으면 전송 계층의 모든 메시지가 기록됩니다. 신뢰할 수 있는 메시징 메시지를 포함하여 모든 인프라 메시지가 이 계층에 기록됩니다. 스트리밍된 메시지에서 헤더만 기록됩니다. 또한 보안 메시지는 HTTPS와 같은 보안 전송이 사용되는 경우를 제외하고 이 수준에서 암호화된 것으로 기록됩니다.
형식 오류가 있는 수준
잘못된 형식의 메시지는 모든 처리 단계에서 WCF 스택에서 거부되는 메시지입니다. 잘못된 형식의 메시지는 as-is에 기록됩니다. 메시지가 암호화되어 있거나 XML 형식이 잘못된 경우, 기타 문제들이 있을 때입니다.
maxSizeOfMessageToLog
로깅할 메시지의 크기를 CDATA로 정의했습니다. 기본적으로 maxSizeOfMessageToLog
256K와 같습니다. 이 특성에 대한 자세한 내용은 기타 옵션 섹션을 참조하세요.
기타 옵션
로깅 수준 외에도 사용자는 다음 옵션을 지정할 수 있습니다.
전체 메시지 로그(
logEntireMessage
특성): 이 값은 전체 메시지(메시지 헤더 및 본문)가 기록되는지 여부를 지정합니다. 기본값은false
헤더만 기록된다는 의미입니다. 이 설정은 서비스 및 전송 메시지 로깅 수준에 영향을 줍니다.로그할 최대 메시지(
maxMessagesToLog
특성): 이 값은 기록할 최대 메시지 수를 지정합니다. 모든 메시지(서비스, 전송 및 잘못된 형식의 메시지)는 이 할당량에 계산됩니다. 할당량에 도달하면 추적이 내보내지고 추가 메시지가 기록되지 않습니다. 기본값은 10000입니다.로그할 메시지의 최대 크기(
maxSizeOfMessageToLog
특성): 이 값은 로그인할 최대 메시지 크기를 바이트 단위로 지정합니다. 크기 제한을 초과하는 메시지는 기록되지 않으며 해당 메시지에 대해 다른 작업이 수행되지 않습니다. 이 설정은 모든 추적 수준에 영향을 줍니다. ServiceModel 추적이 켜진 경우 사용자에게 알리기 위해 첫 번째 로깅 지점(ServiceModelSend* 또는 TransportReceive)에서 경고 수준 추적이 내보내집니다. 서비스 수준 및 전송 수준 메시지의 기본값은 256K이고 형식이 잘못된 메시지의 기본값은 4K입니다.주의
비교할 대상인
maxSizeOfMessageToLog
에 대해 계산된 메시지 크기는 serialization 전에 메모리에 저장된 메시지 크기입니다. 이 크기는 기록되는 메시지 문자열의 실제 길이와 다를 수 있으며 대부분의 경우 실제 크기보다 큽니다. 따라서 메시지가 기록되지 않을 수 있습니다.maxSizeOfMessageToLog
특성을 예상된 메시지 크기보다 10% 더 크게 지정하여 이 사실을 고려할 수 있습니다. 또한 잘못된 형식의 메시지가 기록되는 경우 메시지 로그에서 사용하는 실제 디스크 공간은 지정된maxSizeOfMessageToLog
값의 최대 5배 크기일 수 있습니다.
구성 파일에 추적 수신기가 정의되어 있지 않으면 지정된 로깅 수준에 관계없이 로깅 출력이 생성되지 않습니다.
이 섹션에 설명된 특성과 같은 메시지 로깅 옵션은 WMI(Windows Management Instrumentation)를 사용하여 런타임에 변경할 수 있습니다. 이 작업은 다음과 같은 부울 속성을 노출하는 AppDomainInfo 인스턴스에 액세스하여 수행할 수 있습니다: LogMessagesAtServiceLevel
, LogMessagesAtTransportLevel
, 그리고 LogMalformedMessages
. 따라서 메시지 로깅에 대한 추적 수신기를 구성하지만 이러한 옵션을 false
구성으로 설정하는 경우 나중에 애플리케이션이 실행 중일 때로 true
변경할 수 있습니다. 이를 통해 런타임에 메시지 로깅을 효과적으로 수행할 수 있습니다. 마찬가지로 구성 파일에서 메시지 로깅을 사용하도록 설정하는 경우 WMI를 사용하여 런타임에 메시지 로깅을 사용하지 않도록 설정할 수 있습니다. 자세한 내용은 진단용 Windows Management Instrumentation 사용을 참조하세요.
source
메시지 로그의 필드는 메시지가 기록되는 컨텍스트를 지정합니다. 요청 메시지를 보내거나 받을 때, 요청-회신 또는 1방향 요청, 서비스 모델 또는 전송 계층 또는 잘못된 형식의 메시지의 경우.
형식이 잘못된 메시지의 경우, source
는 Malformed
와 같습니다. 그렇지 않으면 원본의 컨텍스트에 따라 다음 값이 있습니다.
요청/회신의 경우:
레이어 | 요청 보내기 | 수신 요청 | 회신 보내기 | 회신 받기 |
---|---|---|---|---|
서비스 모델 계층 | 서비스 레벨 전송 요청 |
서비스 레벨 받다 요청 |
서비스 레벨 전송 회답 |
서비스 레벨 받다 회답 |
전송 계층 | 운송 전송 |
운송 받다 |
운송 전송 |
운송 받다 |
단방향 요청의 경우:
레이어 | 요청 보내기 | 수신 요청 |
---|---|---|
서비스 모델 계층 | 서비스 레벨 전송 데이터 그램 |
서비스 레벨 받다 데이터 그램 |
전송 계층 | 운송 전송 |
운송 받다 |
메시지 필터
메시지 필터는 messageLogging
구성 섹션의 diagnostics
구성 요소 내에서 정의됩니다. 서비스 및 전송 수준에서 적용됩니다. 하나 이상의 필터가 정의되면 하나 이상의 필터와 일치하는 메시지만 기록됩니다. 필터가 정의되지 않은 경우 모든 메시지가 전달됩니다.
필터는 전체 XPath 구문을 지원하며 구성 파일에 나타나는 순서대로 적용됩니다. 구문적으로 잘못된 필터로 인해 구성 예외가 발생합니다.
필터는 또한 필터와 일치하도록 검사할 수 있는 XPath DOM의 최대 노드 수를 제한하는 특성을 사용하는 nodeQuota
안전 기능을 제공합니다.
다음 예제에서는 SOAP 헤더 섹션이 있는 메시지만 기록하는 필터를 구성하는 방법을 보여줍니다.
<messageLogging logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="420">
<filters>
<add nodeQuota="10" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
/soap:Envelope/soap:Header
</add>
</filters>
</messageLogging>
메시지 본문에는 필터를 적용할 수 없습니다. 메시지 본문을 조작하려는 필터는 필터 목록에서 제거됩니다. 이를 나타내는 이벤트도 내보내집니다. 예를 들어 다음 필터는 필터 테이블에서 제거됩니다.
<add xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">/s:Envelope/s:Body[contains(text(), "Hello")]</add>
사용자 지정 수신기 구성
추가 옵션을 사용하여 사용자 지정 수신기를 구성할 수도 있습니다. 사용자 지정 수신기는 로깅하기 전에 메시지에서 애플리케이션별 PII 요소를 필터링하는 데 유용할 수 있습니다. 다음 예제에서는 사용자 지정 수신기 구성을 보여 줍니다.
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="MyListener"
type="YourCustomListener"
initializeData="c:\logs\messages.svclog"
maxDiskSpace="1000"/>
</listeners>
</source>
</sources>
</system.diagnostics>
특성은 형식의 type
정규화된 어셈블리 이름으로 설정해야 합니다.