Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
이미 관련글들이 많습니다만 일단 정보를 한곳에 모은다는 생각으로 글을 올립니다.
WCF 응용프로그램을 작성하고 테스트를 진행하다 보면 메시지의 흐름이나 실제 패킨의 생김새를 확인하면서 진행해야 할 경우 생기게 됩니다.
Configuring Tracing
https://msdn2.microsoft.com/en-us/library/ms733025.aspx
이때 아래의 링크를 이용해서 Application 이나 Service의 configuration 파일의 내용을 변경하고 실행하게 되면 .svclog 파일들이 생성됩니다.
Configuration 파일의 대략적인 샘플은 아래와 같습니다. 아래에서 {LogFolder} 를 실제 작업 폴더로 설정하시면 됩니다. 당연히 관련 폴더에 대해서 실행 프로세스의 권한으로 파일을 읽고 쓸 수 있도록 권한도 주셔야 합니다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information,ActivityTracing"
propagateActivity="true">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener"
name="Default">
<filter type="" />
</add>
<add name="ServiceModelTraceListener">
<filter type="" />
</add>
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="Information,ActivityTracing">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener"
name="Default">
<filter type="" />
</add>
<add name="ServiceModelMessageLoggingListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData=" {LogFolder}\app_tracelog.svclog"
type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="ServiceModelTraceListener"
traceOutputOptions="Timestamp">
<filter type="" />
</add>
<add initializeData=" {LogFolder} \app_messages.svclog"
type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="ServiceModelMessageLoggingListener"
traceOutputOptions="Timestamp">
<filter type="" />
</add>
</sharedListeners>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"/>
</diagnostics>
</system.serviceModel>
</configuration>
만일 실제 이동되는 실제 자료까지 확인이 필요하고 netmon등의 사용이 여의치 않은 경우는 아래 설정을 해주시면 비슷한 효과를 보실 수 있습니다. 물론 정확한 자료는 netmon이나 WhireShark등을 통해서 가능 하겠지요.
<sources>
<source name="System.Net" tracemode="includehex" maxdatasize="1024">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Cache">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
</sources>
처음 설정예와 달리 각 Source들의 로깅 레벨을 한군데에 모아서 변하게 변경하려면 아래와 같이 Switches를 이용하면 됩니다.
<switches>
<add name="System.Net" value="Verbose"/>
<add name="System.Net.Sockets" value="Verbose"/>
<add name="System.Net.Cache" value="Verbose"/>
</switches>
물론 위의 설정으로 수집되는 파일들을 저장할 listener 도 등록이 되어야 겠지요.
<sharedListeners>
<add name="System.Net"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="network.log" />
</sharedListeners>
아래는 위의 설정에서 수집된 자료의 예 입니다.
연결되는 서버와 전달되는 헤더, 데이터가 보여지고 있네요.
System.Net Verbose: 0 : [12488] WebRequest::Create(https://yonghp08-wcf/SequencalDataTransfer/SequencalDataTransfer.svc)
System.Net Verbose: 0 : [12488] HttpWebRequest#61381290::HttpWebRequest(https://yonghp08-wcf/SequencalDataTransfer/SequencalDataTransfer.svc#2064498314)
System.Net Verbose: 0 : [12488] Exiting HttpWebRequest#61381290::HttpWebRequest()
System.Net Verbose: 0 : [12488] Exiting WebRequest::Create() -> HttpWebRequest#61381290
System.Net Verbose: 0 : [12488] WebRequest::Create(https://korproxy.fareast.corp.microsoft.com/wpad.dat)
System.Net Verbose: 0 : [12488] HttpWebRequest#36848977::HttpWebRequest(https://korproxy.fareast.corp.microsoft.com/wpad.dat#1165780135)
System.Net Verbose: 0 : [12488] Exiting HttpWebRequest#36848977::HttpWebRequest()
System.Net Verbose: 0 : [12488] Exiting WebRequest::Create() -> HttpWebRequest#36848977
System.Net Information: 0 : [12488] Associating HttpWebRequest#36848977 with ServicePoint#22452836
System.Net Verbose: 0 : [12488] HttpWebRequest#36848977::GetResponse()
System.Net.Cache Verbose: 0 : [12488] RequestCacheProtocol#46153895::GetRetrieveStatus(HttpWebRequest#36848977)
System.Net.Cache Information: 0 : [12488] Request#36848977, Policy = Level:Default, Cache Uri = https://korproxy.fareast.corp.microsoft.com/wpad.dat
System.Net.Cache Information: 0 : [12488] Request Method = GET.
System.Net.Cache Information: 0 : [12488] Selected cache Key = https://korproxy.fareast.corp.microsoft.com/wpad.dat
System.Net.Cache Verbose: 0 : [12488] WinInetCache.Retrieve(key = https://korproxy.fareast.corp.microsoft.com/wpad.dat)
System.Net.Cache Information: 0 : [12488] WinInetCache.Retrieve() -> Filename = C:\Users\yonghp\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\IZ02TYFR\wpad[1].dat, Status = Success.
System.Net.Cache Verbose: 0 : [12488] Exiting WinInetCache.Retrieve()() Status = Success
System.Net.Cache Information: 0 : [12488] WinInetReadStream.Close(), Key = https://korproxy.fareast.corp.microsoft.com/wpad.dat.
System.Net.Cache Information: 0 : [12488] ...Dumping Cache Context...
System.Net.Cache Information: 0 : [12488] IsPrivateEntry = True
System.Net.Cache Information: 0 : [12488] IsPartialEntry = False
System.Net.Cache Information: 0 : [12488] StreamSize = 17517
System.Net.Cache Information: 0 : [12488] Expires = Mon, 01 Dec 2008 08:28:42 GMT
System.Net.Cache Information: 0 : [12488] LastAccessed = Mon, 01 Dec 2008 07:44:26 GMT
System.Net.Cache Information: 0 : [12488] LastModified =
System.Net.Cache Information: 0 : [12488] LastSynchronized = Mon, 01 Dec 2008 07:38:42 GMT
System.Net.Cache Information: 0 : [12488] MaxStale(sec) = 0
System.Net.Cache Information: 0 : [12488] HitCount = 13
System.Net.Cache Information: 0 : [12488] UsageCount = 0
System.Net.Cache Information: 0 : [12488] EntryMetadata:
System.Net.Cache Information: 0 : [12488] HTTP/1.1 200 OK
System.Net.Cache Information: 0 : [12488] Content-Type: application/x-ns-proxy-autoconfig
System.Net.Cache Information: 0 : [12488] ---
System.Net.Cache Information: 0 : [12488] SystemMetadata:
System.Net.Cache Information: 0 : [12488] Entry Status Line = HTTP/1.1 200 OK.
System.Net.Cache Information: 0 : [12488] Cache Cache-Control = .
System.Net.Cache Information: 0 : [12488] [Now Time (UTC)] = Mon, 01 Dec 2008 07:45:15 GMT.
System.Net.Cache Information: 0 : [12488] [Age1] Now - LastSynchronized + AgeHeader = 393, Last Synchronized: Mon, 01 Dec 2008 07:38:42 GMT.
System.Net.Cache Information: 0 : [12488] [MaxAge] Cache Expires - Date = 3000, Expires: Mon, 01 Dec 2008 08:28:42 GMT.
System.Net.Cache Information: 0 : [12488] ValidateFreshness(), result = Fresh.
System.Net.Cache Information: 0 : [12488] Cache Age = 393, Cache MaxAge = 3000.
System.Net.Cache Information: 0 : [12488] Valid as fresh or because of Cache Policy = Level:Default.
System.Net.Cache Information: 0 : [12488] ValidateCache(), result = ReturnCachedResponse.
System.Net.Cache Verbose: 0 : [12488] Exiting RequestCacheProtocol#46153895::GetRetrieveStatus() -> result = ReturnCachedResponse
System.Net Verbose: 0 : [12488] Exiting HttpWebRequest#36848977::GetResponse() -> HttpWebResponse#46418718
System.Net Verbose: 0 : [12488] HttpWebResponse#46418718::GetResponseStream()
System.Net Information: 0 : [12488] ContentLength=17517
System.Net Verbose: 0 : [12488] Exiting HttpWebResponse#46418718::GetResponseStream() -> SingleItemRequestCache+ReadOnlyStream#50920718
System.Net Verbose: 0 : [12488] HttpWebResponse#46418718::Close()
System.Net Verbose: 0 : [12488] Exiting HttpWebResponse#46418718::Close()
System.Net Information: 0 : [12488] Associating HttpWebRequest#61381290 with ServicePoint#29803642
System.Net Verbose: 0 : [12488] HttpWebRequest#61381290::GetRequestStream()
System.Net Information: 0 : [12488] Associating Connection#36899882 with HttpWebRequest#61381290
System.Net.Sockets Verbose: 0 : [12488] Socket#23318221::Socket(InterNetwork#2)
System.Net.Sockets Verbose: 0 : [12488] Exiting Socket#23318221::Socket()
System.Net.Sockets Verbose: 0 : [12488] Socket#60865449::Socket(InterNetworkV6#23)
System.Net.Sockets Verbose: 0 : [12488] Exiting Socket#60865449::Socket()
System.Net.Sockets Verbose: 0 : [12488] Socket#23318221::Connect(112:80#1879653581)
System.Net.Sockets Verbose: 0 : [12488] Exiting Socket#23318221::Connect()
System.Net.Sockets Verbose: 0 : [12488] Socket#60865449::Close()
System.Net.Sockets Verbose: 0 : [12488] Socket#60865449::Dispose()
System.Net.Sockets Verbose: 0 : [12488] Exiting Socket#60865449::Close()
System.Net Information: 0 : [12488] Associating HttpWebRequest#61381290 with ConnectStream#28079681
System.Net Information: 0 : [12488] HttpWebRequest#61381290 - Request: POST /SequencalDataTransfer/SequencalDataTransfer.svc HTTP/1.1
System.Net.Sockets Verbose: 0 : [12488] Socket#23318221::Send()
System.Net.Sockets Verbose: 0 : [12488] Data from Socket#23318221::Send
System.Net.Sockets Verbose: 0 : [12488] 00000000 : 50 4F 53 54 20 2F 53 65-71 75 65 6E 63 61 6C 44 : POST /SequencalD
System.Net.Sockets Verbose: 0 : [12488] 00000010 : 61 74 61 54 72 61 6E 73-66 65 72 2F 53 65 71 75 : ataTransfer/Sequ
System.Net.Sockets Verbose: 0 : [12488] 00000020 : 65 6E 63 61 6C 44 61 74-61 54 72 61 6E 73 66 65 : encalDataTransfe
System.Net.Sockets Verbose: 0 : [12488] 00000030 : 72 2E 73 76 63 20 48 54-54 50 2F 31 2E 31 0D 0A : r.svc HTTP/1.1..
System.Net.Sockets Verbose: 0 : [12488] 00000040 : 4D 49 4D 45 2D 56 65 72-73 69 6F 6E 3A 20 31 2E : MIME-Version: 1.
System.Net.Sockets Verbose: 0 : [12488] 00000050 : 30 0D 0A 43 6F 6E 74 65-6E 74 2D 54 79 70 65 3A : 0..Content-Type:
System.Net.Sockets Verbose: 0 : [12488] 00000060 : 20 6D 75 6C 74 69 70 61-72 74 2F 72 65 6C 61 74 : multipart/relat
System.Net.Sockets Verbose: 0 : [12488] 00000070 : 65 64 3B 20 74 79 70 65-3D 22 61 70 70 6C 69 63 : ed; type="applic
System.Net.Sockets Verbose: 0 : [12488] 00000080 : 61 74 69 6F 6E 2F 78 6F-70 2B 78 6D 6C 22 3B 73 : ation/xop+xml";s
System.Net.Sockets Verbose: 0 : [12488] 00000090 : 74 61 72 74 3D 22 3C 68-74 74 70 3A 2F 2F 74 65 : tart="<https://te
System.Net.Sockets Verbose: 0 : [12488] 000000A0 : 6D 70 75 72 69 2E 6F 72-67 2F 30 3E 22 3B 62 6F : mpuri.org/0>";bo
System.Net.Sockets Verbose: 0 : [12488] 000000B0 : 75 6E 64 61 72 79 3D 22-75 75 69 64 3A 31 61 38 : undary="uuid:1a8
System.Net.Sockets Verbose: 0 : [12488] 000000C0 : 63 37 34 37 65 2D 34 62-37 63 2D 34 33 61 36 2D : c747e-4b7c-43a6-
System.Net.Sockets Verbose: 0 : [12488] 000000D0 : 62 36 32 31 2D 66 30 64-65 34 38 36 66 66 65 30 : b621-f0de486ffe0
System.Net.Sockets Verbose: 0 : [12488] 000000E0 : 30 2B 69 64 3D 31 22 3B-73 74 61 72 74 2D 69 6E : 0+id=1";start-in
System.Net.Sockets Verbose: 0 : [12488] 000000F0 : 66 6F 3D 22 74 65 78 74-2F 78 6D 6C 22 0D 0A 53 : fo="text/xml"..S
System.Net.Sockets Verbose: 0 : [12488] 00000100 : 4F 41 50 41 63 74 69 6F-6E 3A 20 22 68 74 74 70 : OAPAction: "http
System.Net.Sockets Verbose: 0 : [12488] 00000110 : 3A 2F 2F 74 65 6D 70 75-72 69 2E 6F 72 67 2F 49 : ://tempuri.org/I
System.Net.Sockets Verbose: 0 : [12488] 00000120 : 44 61 74 61 54 72 61 6E-73 66 65 72 53 65 72 76 : DataTransferServ
System.Net.Sockets Verbose: 0 : [12488] 00000130 : 69 63 65 2F 52 65 63 69-76 65 44 61 74 61 22 0D : ice/ReciveData".
System.Net.Sockets Verbose: 0 : [12488] 00000140 : 0A 48 6F 73 74 3A 20 79-6F 6E 67 68 70 30 38 2D : .Host: yonghp08-
System.Net.Sockets Verbose: 0 : [12488] 00000150 : 77 63 66 0D 0A 54 72 61-6E 73 66 65 72 2D 45 6E : wcf..Transfer-En
System.Net.Sockets Verbose: 0 : [12488] 00000160 : 63 6F 64 69 6E 67 3A 20-63 68 75 6E 6B 65 64 0D : coding: chunked.
System.Net.Sockets Verbose: 0 : [12488] 00000170 : 0A 45 78 70 65 63 74 3A-20 31 30 30 2D 63 6F 6E : .Expect: 100-con
System.Net.Sockets Verbose: 0 : [12488] 00000180 : 74 69 6E 75 65 0D 0A 43-6F 6E 6E 65 63 74 69 6F : tinue..Connectio
System.Net.Sockets Verbose: 0 : [12488] 00000190 : 6E 3A 20 4B 65 65 70 2D-41 6C 69 76 65 0D 0A 0D : n: Keep-Alive...
System.Net.Sockets Verbose: 0 : [12488] 000001A0 : 0A : .
System.Net.Sockets Verbose: 0 : [12488] Exiting Socket#23318221::Send() -> 417#417
System.Net Information: 0 : [12488] ConnectStream#28079681 - Sending headers
{
MIME-Version: 1.0
Content-Type: multipart/related; type="application/xop+xml";start="<https://tempuri.org/0>";boundary="uuid:1a8c747e-4b7c-43a6-b621-f0de486ffe00+id=1";start-info="text/xml"
SOAPAction: "https://tempuri.org/IDataTransferService/ReciveData"
Host: yonghp08-wcf
Transfer-Encoding: chunked
Expect: 100-continue
Connection: Keep-Alive
}.
System.Net.Sockets Verbose: 0 : [12488] Socket#23318221::Receive()
System.Net.Sockets Verbose: 0 : [12488] Data from Socket#23318221::Receive
System.Net.Sockets Verbose: 0 : [12488] 00000000 : 48 54 54 50 2F 31 2E 31-20 31 30 30 20 43 6F 6E : HTTP/1.1 100 Con
System.Net.Sockets Verbose: 0 : [12488] 00000010 : 74 69 6E 75 65 0D 0A 0D-0A : tinue....
생성된 로그들은 SvcTraceViewer를 통해서 파싱후 각메시지별 이나 전체 흐름의 관점에서 확인 할 수 있습니다.
Service Trace Viewer Tool (SvcTraceViewer.exe)
https://msdn2.microsoft.com/en-us/library/ms732023.aspx
Comments
- Anonymous
December 01, 2008
PingBack from http://blog.a-foton.ru/index.php/2008/12/02/wcf-trace-view-trace-logs/