Konfigurowanie rejestrowania komunikatów
W tym temacie opisano sposób konfigurowania rejestrowania komunikatów dla różnych scenariuszy.
Włączanie rejestrowania komunikatów
Program Windows Communication Foundation (WCF) domyślnie nie rejestruje komunikatów. Aby aktywować rejestrowanie komunikatów, należy dodać odbiornik śledzenia do System.ServiceModel.MessageLogging
źródła śledzenia i ustawić atrybuty elementu <messagelogging>
w pliku konfiguracji.
W poniższym przykładzie pokazano, jak włączyć rejestrowanie i określić dodatkowe opcje.
<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>
Aby uzyskać więcej informacji na temat ustawień rejestrowania komunikatów, zobacz Zalecane Ustawienia dotyczące śledzenia i rejestrowania komunikatów.
Możesz użyć add
polecenia , aby określić nazwę i typ odbiornika, którego chcesz użyć. W przykładowej konfiguracji odbiornik ma nazwę "messages" i dodaje standardowy odbiornik śledzenia programu .NET Framework (System.Diagnostics.XmlWriterTraceListener
) jako typ do użycia. Jeśli używasz System.Diagnostics.XmlWriterTraceListener
polecenia , musisz określić lokalizację pliku wyjściowego i nazwę w pliku konfiguracji. W tym celu należy ustawić initializeData
nazwę pliku dziennika. W przeciwnym razie system zgłasza wyjątek. Można również zaimplementować odbiornik niestandardowy, który emituje dzienniki do pliku domyślnego.
Uwaga
Ponieważ rejestrowanie komunikatów uzyskuje dostęp do miejsca na dysku, należy ograniczyć liczbę komunikatów zapisywanych na dysku dla określonej usługi. Po osiągnięciu limitu komunikatów zostanie wygenerowany ślad na poziomie informacje i zatrzymanie wszystkich działań rejestrowania komunikatów.
Poziom rejestrowania, a także dodatkowe opcje, zostały omówione w sekcji Poziom rejestrowania i opcje.
Atrybut switchValue
elementu source
jest prawidłowy tylko do śledzenia. Jeśli określisz switchValue
atrybut dla System.ServiceModel.MessageLogging
źródła śledzenia w następujący sposób, nie ma to wpływu.
<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
</source>
Jeśli chcesz wyłączyć źródło śledzenia, należy zamiast tego messageLogging
użyć logMessagesAtServiceLevel
atrybutów , logMalformedMessages
i logMessagesAtTransportLevel
elementu . Należy ustawić wszystkie te atrybuty na false
. Można to zrobić przy użyciu pliku konfiguracji w poprzednim przykładzie kodu, za pośrednictwem interfejsu interfejsu użytkownika edytora konfiguracji lub przy użyciu usługi WMI. Aby uzyskać więcej informacji na temat narzędzia Edytor konfiguracji, zobacz Narzędzie edytora konfiguracji (SvcConfigEditor.exe). Aby uzyskać więcej informacji na temat usługi WMI, zobacz Using Windows Management Instrumentation for Diagnostics (Używanie instrumentacji zarządzania Windows do diagnostyki).
Poziomy i opcje rejestrowania
W przypadku komunikatów przychodzących rejestrowanie odbywa się natychmiast po utworzeniu komunikatu, bezpośrednio przed pobraniem komunikatu do kodu użytkownika na poziomie usługi, a po wykryciu źle sformułowanych komunikatów.
W przypadku komunikatów wychodzących rejestrowanie odbywa się natychmiast po opuszczeniu kodu użytkownika i bezpośrednio przed przejściem komunikatu do sieci.
Program WCF rejestruje komunikaty na dwóch różnych poziomach: usługi i transportu. Źle sformułowane komunikaty są również rejestrowane. Trzy kategorie są niezależne od siebie i można je aktywować oddzielnie w konfiguracji.
Poziom rejestrowania można kontrolować, ustawiając logMessagesAtServiceLevel
atrybuty , logMalformedMessages
i logMessagesAtTransportLevel
elementu messageLogging
.
Poziom usługi
Komunikaty zarejestrowane w tej warstwie mają na celu wprowadzenie (po odebraniu) lub pozostawienie (przy wysyłaniu) kodu użytkownika. Jeśli filtry zostały zdefiniowane, rejestrowane są tylko komunikaty zgodne z filtrami. W przeciwnym razie wszystkie komunikaty na poziomie usługi są rejestrowane. Komunikaty infrastruktury (transakcje, kanał równorzędny i zabezpieczenia) są również rejestrowane na tym poziomie, z wyjątkiem komunikatów reliable messaging. W przypadku komunikatów przesyłanych strumieniowo rejestrowane są tylko nagłówki. Ponadto bezpieczne komunikaty są rejestrowane na tym poziomie.
Poziom transportu
Komunikaty zarejestrowane w tej warstwie są gotowe do kodowania lub dekodowania dla lub po przewiezieniu przewodu. Jeśli filtry zostały zdefiniowane, rejestrowane są tylko komunikaty zgodne z filtrami. W przeciwnym razie wszystkie komunikaty w warstwie transportu są rejestrowane. Wszystkie komunikaty infrastruktury są rejestrowane w tej warstwie, w tym niezawodne komunikaty komunikatów. W przypadku komunikatów przesyłanych strumieniowo rejestrowane są tylko nagłówki. Ponadto bezpieczne komunikaty są rejestrowane jako zaszyfrowane na tym poziomie, z wyjątkiem sytuacji, gdy jest używany bezpieczny transport, taki jak HTTPS.
Źle sformułowany poziom
Źle sformułowane komunikaty to komunikaty, które są odrzucane przez stos WCF na dowolnym etapie przetwarzania. Źle sformułowane komunikaty są rejestrowane jako: szyfrowane, jeśli tak, z nieprawidłowym kodem XML itd. maxSizeOfMessageToLog
zdefiniowano rozmiar komunikatu do zarejestrowania jako CDATA. Domyślnie maxSizeOfMessageToLog
jest równe 256K. Aby uzyskać więcej informacji na temat tego atrybutu, zobacz sekcję Inne opcje.
Inne opcje
Oprócz poziomów rejestrowania użytkownik może określić następujące opcje:
Dziennik cały komunikat (
logEntireMessage
atrybut): ta wartość określa, czy cały komunikat (nagłówek i treść wiadomości) jest rejestrowany. Wartość domyślna tofalse
, co oznacza, że rejestrowany jest tylko nagłówek. To ustawienie ma wpływ na poziomy rejestrowania komunikatów usługi i transportu.Maksymalna liczba komunikatów do dziennika (
maxMessagesToLog
atrybut): ta wartość określa maksymalną liczbę komunikatów do zarejestrowania. Wszystkie komunikaty (usługa, transport i źle sformułowane komunikaty) są liczone do tego limitu przydziału. Po osiągnięciu limitu przydziału jest emitowany ślad i nie jest rejestrowany żaden dodatkowy komunikat. Wartość domyślna to 10000.Maksymalny rozmiar komunikatu do dziennika (
maxSizeOfMessageToLog
atrybut): ta wartość określa maksymalny rozmiar komunikatów do logowania się w bajtach. Komunikaty, które przekraczają limit rozmiaru, nie są rejestrowane i nie są wykonywane żadne inne działania dla tego komunikatu. To ustawienie ma wpływ na wszystkie poziomy śledzenia. Jeśli śledzenie modelu ServiceModel jest włączone, śledzenie na poziomie ostrzeżenia jest emitowane w pierwszym punkcie rejestrowania (ServiceModelSend* lub TransportReceive), aby powiadomić użytkownika. Wartość domyślna komunikatów na poziomie usługi i na poziomie transportu to 256K, a wartość domyślna źle sformułowanych komunikatów to 4K.Uwaga
Rozmiar komunikatu obliczony do porównania
maxSizeOfMessageToLog
jest rozmiarem komunikatu w pamięci przed serializacji. Ten rozmiar może różnić się od rzeczywistej długości rejestrowanego ciągu komunikatu, a w wielu przypadkach jest większy niż rzeczywisty rozmiar. W związku z tym komunikaty mogą nie być rejestrowane. Ten fakt można uwzględnić, określającmaxSizeOfMessageToLog
atrybut o rozmiarze 10% większym niż oczekiwany rozmiar komunikatu. Ponadto, jeśli źle sformułowane komunikaty są rejestrowane, rzeczywiste miejsce na dysku używane przez dzienniki komunikatów może wynosić do 5 razy więcej niż rozmiar wartości określonej przezmaxSizeOfMessageToLog
.
Jeśli w pliku konfiguracji nie zdefiniowano odbiornika śledzenia, żadne dane wyjściowe rejestrowania nie są generowane niezależnie od określonego poziomu rejestrowania.
Opcje rejestrowania komunikatów, takie jak atrybuty opisane w tej sekcji, można zmienić w czasie wykonywania przy użyciu instrumentacji zarządzania Windows (WMI). Można to zrobić, korzystając z wystąpienia AppDomainInfo , które uwidacznia następujące właściwości logiczne: LogMessagesAtServiceLevel
, LogMessagesAtTransportLevel
i LogMalformedMessages
. W związku z tym jeśli skonfigurujesz odbiornik śledzenia na potrzeby rejestrowania komunikatów, ale ustawisz te opcje na false
w konfiguracji, możesz później zmienić je na true
gdy aplikacja jest uruchomiona. Umożliwia to efektywne rejestrowanie komunikatów w czasie wykonywania. Podobnie, jeśli włączysz rejestrowanie komunikatów w pliku konfiguracji, możesz go wyłączyć w czasie wykonywania przy użyciu usługi WMI. Aby uzyskać więcej informacji, zobacz Using Windows Management Instrumentation for Diagnostics (Używanie instrumentacji zarządzania Windows do diagnostyki).
Pole source
w dzienniku komunikatów określa, w którym kontekście jest rejestrowany komunikat: podczas wysyłania/odbierania wiadomości żądania, żądania odpowiedzi lub żądania 1-way, modelu usługi lub warstwy transportu lub w przypadku źle sformułowanej wiadomości.
W przypadku źle sformułowanych komunikatów source
wartość jest równa Malformed
. W przeciwnym razie źródło ma następujące wartości na podstawie kontekstu.
W przypadku żądania/odpowiedzi:
Warstwa | Wyślij żądanie | Żądanie odbioru | Wyślij odpowiedź | Odbierz odpowiedź |
---|---|---|---|---|
Warstwa modelu usługi | Usługa Poziom Wysyłanie Żądanie |
Usługa Poziom Pobierz Żądanie |
Usługa Poziom Wysyłanie Odpowiedź |
Usługa Poziom Pobierz Odpowiedź |
Warstwa transportowa | Transport Wysyłanie |
Transport Pobierz |
Transport Wysyłanie |
Transport Pobierz |
W przypadku żądania jednokierunkowego:
Warstwa | Wyślij żądanie | Żądanie odbioru |
---|---|---|
Warstwa modelu usługi | Usługa Poziom Wysyłanie Datagram |
Usługa Poziom Pobierz Datagram |
Warstwa transportowa | Transport Wysyłanie |
Transport Pobierz |
Filtry komunikatów
Filtry komunikatów są definiowane w messageLogging
elemecie diagnostics
konfiguracji sekcji konfiguracji. Są one stosowane na poziomie usług i transportu. Po zdefiniowaniu co najmniej jednego filtru rejestrowane są tylko komunikaty zgodne z co najmniej jednym z filtrów. Jeśli żaden filtr nie jest zdefiniowany, wszystkie komunikaty przechodzą przez.
Filtry obsługują pełną składnię XPath i są stosowane w kolejności, w której są wyświetlane w pliku konfiguracji. Niepoprawny składniowo filtr powoduje wyjątek konfiguracji.
Filtry zapewniają również funkcję bezpieczeństwa przy użyciu atrybutu nodeQuota
, który ogranicza maksymalną liczbę węzłów w XPath DOM, które można zbadać w celu dopasowania filtru.
W poniższym przykładzie pokazano, jak skonfigurować filtr, który rejestruje tylko komunikaty, które mają sekcję nagłówka protokołu 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>
Nie można zastosować filtrów do treści komunikatu. Filtry, które próbują manipulować treścią wiadomości, są usuwane z listy filtrów. Zdarzenie jest również emitowane, które wskazuje na to. Na przykład następujący filtr zostanie usunięty z tabeli filtrów.
<add xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">/s:Envelope/s:Body[contains(text(), "Hello")]</add>
Konfigurowanie odbiornika niestandardowego
Można również skonfigurować odbiornik niestandardowy przy użyciu dodatkowych opcji. Niestandardowy odbiornik może być przydatny podczas filtrowania elementów piI specyficznych dla aplikacji przed rejestrowaniem. W poniższym przykładzie pokazano konfigurację odbiornika niestandardowego.
<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>
Należy pamiętać, że type
atrybut powinien być ustawiony na kwalifikowaną nazwę zestawu typu.