Поделиться через


Настройка ведения журнала сообщений

В этом разделе описывается, как настроить ведение журнала сообщений для различных сценариев.

Включение ведения журнала сообщений

В 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 имя файла журнала. В противном случае система создает исключение. Кроме того, можно реализовать пользовательский прослушиватель, который выводит журналы в файл по умолчанию.

ms730064.Caution(ru-ru,VS.100).gifВнимание!
Поскольку для ведения журнала сообщений требуется место на диске, необходимо ограничить число сообщений, записываемых на диск для конкретной службы. Когда достигается максимальное число сообщений, создается трассировка на уровне информации, и все операции по ведению журнала сообщений останавливаются.

Уровень ведения журнала, а также дополнительные параметры, описаны в разделе.

Действие атрибута switchValue элемента source распространяется только на трассировку. Если задать атрибут switchValue источника трассировки System.ServiceModel.MessageLogging, как показано ниже, это ни к чему не приведет.

<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">

Если требуется отключить источник трассировки, следует использовать атрибуты logMessagesAtServiceLevel, logMalformedMessages и logMessagesAtTransportLevel элемента messageLogging. Все эти атрибуты должны иметь значение false. Для этого можно воспользоваться файлом конфигурации, приведенным в последнем примере кода, пользовательским интерфейсом редактора конфигурации или инструментарием WMI. Дополнительные сведения о редакторе конфигурации см. в разделе Средство редактирования конфигурации (SvcConfigEditor.exe). Дополнительные сведения об инструментарии WMI см. в разделе Использование Windows Management Instrumentation для диагностики.

Уровни и параметры ведения журнала

Для входящих сообщений регистрация в журнале осуществляется сразу после формирования сообщения, непосредственно перед попаданием сообщения в пользовательский код на уровне службы и при обнаружении неправильно сформированных сообщений.

Для исходящих сообщений регистрация в журнале осуществляется сразу после выхода сообщения из пользовательского кода и непосредственно перед отправкой сообщения по каналам связи.

В WCF ведение журнала сообщений происходит на двух уровнях: уровне службы и уровне транспорта. Также регистрируются неправильно сформированные сообщения. Эти три категории журнала не зависят друг от друга и могут активироваться в конфигурации по отдельности.

Для управления уровнем ведения журнала необходимо задать атрибуты logMessagesAtServiceLevel, logMalformedMessages и logMessagesAtTransportLevel элемента messageLogging.

Уровень службы

Сообщения, регистрируемые на этом уровне, готовы к входу (при получении) в пользовательский код или выходу (при отправке) из него. Если определены фильтры, в журнал записываются только сообщения, соответствующие этим фильтрам. В противном случае в журнал записываются все сообщения на уровне службы. На этом уровне также регистрируются сообщения инфраструктуры (транзакции, сообщения одноранговых каналов и безопасности), кроме сообщений системы надежного обмена сообщениями. Для потоковых сообщений в журнал заносятся только заголовки. Защищенные сообщения регистрируются на этом уровне в расшифрованном виде.

Уровень транспорта

Сообщения, записываемые в журнал на этом уровне, готовы к кодированию или раскодированию для передачи по каналам связи или после нее. Если определены фильтры, в журнал записываются только сообщения, соответствующие этим фильтрам. В противном случае в журнал записываются все сообщения на уровне транспорта. На этом уровне регистрируются все сообщения инфраструктуры, включая сообщения системы надежного обмена сообщениями. Для потоковых сообщений в журнал заносятся только заголовки. Защищенные сообщения регистрируются на этом уровне в зашифрованном виде, если не используется защищенный транспорт, например протокол HTTPS.

Уровень неправильно составленных сообщений

Неправильно сформированные сообщения — это сообщения, которые отклоняются стеком WCF на каком-либо из этапов обработки. Неправильно сформированные сообщения записываются в журнал как есть: в зашифрованном виде, в виде некорректного XML-кода и т. д. Свойство maxSizeOfMessageToLog определяет размер сообщения, записываемого в журнал в виде CDATA. По умолчанию свойство maxSizeOfMessageToLog имеет значение 256 КБ. Дополнительные сведения об этом атрибуте см. в разделе.

Другие параметры

Помимо уровня ведения журнала можно задать следующие параметры.

  • Записывать в журнал сообщение целиком (атрибут logEntireMessage). Логическое значение, указывающее, записывается ли в журнал сообщение целиком (тело и заголовок сообщения). Значением по умолчанию является false, означающее, что в журнал записывается только заголовок сообщения. Действие этого параметра распространяется на уровни ведения журнала службы и транспорта.

  • Максимальное число сообщений для внесения в журнал (атрибут maxMessagesToLog). Значение, задающее максимальное количество сообщений для внесения в журнал. Это значение относится ко всем сообщениям (службы, транспорта и неправильно сформированным сообщениям). После достижения этого значения создается трассировка и новые сообщения в журнал не заносятся. Значение по умолчанию — 10000.

  • Максимальный размер сообщения для внесения в журнал (атрибут maxSizeOfMessageToLog). Значение, задающее максимальный размер сообщения для внесения в журнал в байтах. Сообщения, превышающие этот размер, в журнал не заносятся, и никакие другие действия с этими сообщениями не выполняются. Действие этого параметра распространяется на все уровни трассировки. Если включена трассировка ServiceModel, в первой точке записи в журнал (ServiceModelSend* или TransportReceive) создается трассировка порога предупреждений для уведомления пользователя. Значение по умолчанию для сообщений уровня службы и транспорта составляет 256 КБ, а для неправильно сформированных сообщений — 4 КБ. Внимание! Размер сообщения, вычисляемый для сравнения со значением maxSizeOfMessageToLog, является размером сообщения в памяти до сериализации. Этот размер может отличаться от фактической длины строки сообщения, записываемой в журнал, и часто превышает фактический размер сообщения. Поэтому сообщение может быть не записано в журнал. Можно учесть этот факт, установив для атрибута maxSizeOfMessageToLog значение, на 10% превышающее ожидаемый размер сообщения. Кроме того, при внесении в журнал неправильно сформированного сообщения фактическое место на диске, занимаемое журналом сообщений, может до 5 раз превышать размер, задаваемый значением maxSizeOfMessageToLog.

Если в файле конфигурации не задан прослушиватель трассировки, в журнал ничего не записывается независимо от установленного уровня ведения журнала.

Параметры ведения журнала, например описанные в этом разделе атрибуты, можно изменить во время выполнения с помощью инструментария управления Windows (WMI). Для этого необходимо обратиться к экземпляру AppDomainInfo, который предоставляет доступ к следующим логическим свойствам: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel и LogMalformedMessages. Поэтому, если в файле конфигурации прослушиватель трассировки настроен на ведение журнала, но эти параметры имеют значение false, можно впоследствии изменить их значения на true, когда приложение будет выполняться. В результате ведение журнала будет включено во время выполнения. Аналогично, если ведение журнала было включено в файле конфигурации, его можно отключить во время выполнения с помощью инструментария WMI. Дополнительные сведения см. в разделе Использование Windows Management Instrumentation для диагностики.

Поле source в журнале сообщений определяет контекст, в котором регистрируется сообщение: отправка или получение сообщения с запросом, запрос-ответ или односторонний запрос, модель службы или транспортный уровень, либо неправильно сформированное сообщение.

Для неправильно сформированных сообщений значение source равняется Malformed. В противном случае поле source будет иметь следующие значения в зависимости от контекста.

Запросы и ответы

Отправка запроса Получение запроса Отправка ответа Получение ответа

Уровень модели службы

Service

Level

Send

Request

Service

Level

Receive

Request

Service

Level

Send

Reply

Service

Level

Receive

Reply

Уровень транспорта

Transport

Send

Transport

Receive

Transport

Send

Transport

Receive

Односторонний запрос

Отправка запроса Получение запроса

Уровень модели службы

Service

Level

Send

Datagram

Service

Level

Receive

Datagram

Уровень транспорта

Transport

Send

Transport

Receive

Фильтры сообщений

Фильтры сообщений определяются в элементе конфигурации messageLogging в разделе diagnostics. Они применяются на уровне службы и транспорта. Если в файле конфигурации определены один или несколько фильтров, в журнал записываются только сообщения, соответствующие хотя бы одному из фильтров. Если фильтры не заданы, в журнал записываются все сообщения.

Фильтры поддерживают полный синтаксис XPath и применяются в том порядке, в котором они записаны в файле конфигурации. Синтаксически неверные фильтры вызывают исключения конфигурации.

Кроме того, атрибут nodeQuota обеспечивает механизм защиты фильтров. Он ограничивает максимальное число узлов объектной модели XPath, которые можно проверить на соответствие фильтру.

В следующем примере показано, как настроить фильтр для записи только сообщений с разделом заголовка 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="https://schemas.xmlsoap.org/soap/envelope/">/s:Envelope/s:Body[contains(text(), "Hello")]</add>

Настройка пользовательского прослушивателя

Имеется возможность настроить пользовательский прослушиватель с дополнительными параметрами. Пользовательский прослушиватель может оказаться полезным для удаления из сообщений элементов с личной информацией, относящихся к конкретным приложениям, перед внесением в журнал этих сообщений. Ниже показан пример конфигурации пользовательского прослушивателя.

<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 следует задавать определенное имя сборки данного типа.

См. также

Основные понятия

Рекомендуемые параметры для трассировки и ведения журналов сообщений

Другие ресурсы

<messageLogging>
Ведение журнала сообщений