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


Диагностическая трассировка

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

Один из таких прослушивателей, DefaultTraceListener, автоматически создается и инициализируется при включении трассировки. Для передачи выходных данных трассировки каким-либо дополнительным источникам необходимо создать и инициализировать дополнительные прослушиватели трассировки. Создаваемые прослушиватели должны соответствовать индивидуальным требованиям пользователя. Например, может потребоваться текстовая запись всех выходных данных трассировки. В этом случае можно создать прослушиватель, который при включении будет записывать все выходные данные в новый текстовый файл. С другой стороны, возможно, потребуется только просмотр выходных данных во время выполнения приложения. В этом случае следует создать прослушиватель, который будет направлять все выходные данные в окно консоли. Прослушиватель EventLogTraceListener может направлять выходные данные трассировки в журнал событий, а прослушиватель TextWriterTraceListener может записывать их в поток.

Включение трассировки

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

<configuration>  
<system.diagnostics>  
     <sources>  
          <source name="System.Transactions" switchValue="Warning">  
               <listeners>  
                    <add name="tx"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "tx.log" />  
               </listeners>  
          </source>  
     </sources>  
</system.diagnostics>  
</configuration>  

Трассировки System.Transactions записываются в источник с именем «System.Transactions». С помощью add можно задать имя и тип прослушивателя трассировки, который требуется использовать. В данном примере создается прослушиватель с именем "tx" и добавляется стандартный прослушиватель трассировки .NET Framework (XmlWriterTraceListener) в качестве типа, который требуется использовать. Чтобы задать имя файла журнала для этого прослушивателя, используйте initializeData. Кроме того, можно заменить простое имя файла полным путем.

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

Уровень трассировки Description
Критически важно Указывает на серьезные сбои, например:

— Ошибка, которая может вызвать немедленную потерю функциональности пользователей.
— Событие, требующее от администратора принять меры, чтобы избежать потери функциональных возможностей.
— код зависает.
— Этот уровень трассировки также может обеспечить достаточный контекст для интерпретации других критически важных трассировок. Это позволяет определить последовательность операций, приводящих в серьезному сбою.
Ошибка Ошибка (например, в результате обнаружения недопустимой конфигурации или недопустимого поведения в сети), которая может привести к потере функциональности.
Предупреждение Условие, которое может привести к ошибке или критическому сбою (например, в результате неправильного выделения памяти или превышения заданного предела). Предупреждение также может быть сформировано в ходе стандартной обработки ошибок пользовательского кода (например, в результате прерывания транзакции, истечения времени ожидания, непрохождения проверки подлинности).
Информация Сообщения, полезные для мониторинга и диагностики состояния системы, измерения производительности или профилирования. К ним, в частности, относятся события транзакции и времени существования зачисления, такие как создание или фиксация транзакции, выход за существенную границу или выделение существенных ресурсов. Эта информация может затем использоваться разработчиком для планирования загрузки и управления производительностью.

Коды трассировки

В следующей таблице перечислены коды трассировки, формируемые инфраструктурой System.Transactions. В таблице входят идентификатор кода трассировки, EventType уровень перечисления трассировки и дополнительные данные, содержащиеся в TraceRecord для трассировки. Кроме того, соответствующий уровень трассировки трассировки также хранится в TraceRecord.

TraceCode EventType Дополнительные данные в TraceRecord
TransactionCreated Сведения TransactionTraceId
TransactionPromoted Сведения Идентификатор TransactionTraceId локальной транзакции, идентификатор TransactionTraceId распределенной транзакции
EnlistmentCreated Сведения TransactionTraceId, EnlistmentTraceId, EnlistmentType (durable/volatile), EnlistmentOptions
EnlistmentCallbackNegative Предупреждение TransactionTraceId, EnlistmentTraceId,

Обратный вызов (forcerollback/aborted/indoubt)
TransactionRollbackCalled Предупреждение TransactionTraceId
TransactionAborted Предупреждение TransactionTraceId
TransactionInDoubt Предупреждение TransactionTraceId
TransactionScopeCreated Сведения TransactionScopeResult. Ниже представлены возможные значения.

— новая транзакция.
— Транзакция, переданная.
— Зависимые транзакции, переданные.
— использование текущей транзакции.
- Нет транзакции.

Идентификатор TransactionTraceId новой текущей транзакции
TransactionScopeDisposed Сведения TransactionTraceId текущей транзакции область " ожидаемой".
TransactionScopeIncomplete Предупреждение TransactionTraceId текущей транзакции область " ожидаемой".
TransactionScopeNestedIncorrectly Предупреждение TransactionTraceId текущей транзакции область " ожидаемой".
TransactionScopeCurrentTransactionChanged Предупреждение Идентификатор TransactionTraceId прежней текущей транзакции, другой идентификатор TransactionTraceId
TransactionScopeTimeout Предупреждение TransactionTraceId текущей транзакции область " ожидаемой".
DependentCloneCreated Сведения TransactionTraceId, тип созданной зависимой транзакции (RollbackIfNotComplete/BlockCommitUntilComplete)
DependentCloneComplete Сведения TransactionTraceId
RecoveryComplete Сведения GUID диспетчера ресурсов (из базы)
Reenlist Сведения GUID диспетчера ресурсов (из базы)
TransactionSerialized Сведения TransactionTraceId
TransactionException Ошибка Сообщение об исключении
InvalidOperationException Ошибка Сообщение об исключении
InternalError Критически важно Сообщение об исключении
TransferEvent При десериализации или повышении транзакции System.Transactions до распределенной транзакции выполняется запись текущего идентификатора ActivityID из контекста ExecutionContext и идентификатора распределенной транзакции.

Когда координатор DTC передает обратный вызов управляемому коду, в контексте ExecutionContext в качестве идентификатора ActivityID устанавливается идентификатор распределенной транзакции в течение выполнения обратного вызова.
ConfiguredDefaultTimeoutAdjusted Предупреждение Дополнительные данные отсутствуют.
TransactionTimeout Предупреждение Идентификатор TransactionTraceId транзакции, время ожидания которой истекает.

Схема XML для каждого из указанных выше элемента дополнительных данных имеет следующий формат.

TransactionTraceIdentifier

<TransactionTraceIdentifier>

<TransactionIdentifier >

string representation of transaction id

</TransactionIdentifier>

< CloneIdentifier >

the clone id number

</CloneIdentifier>

</TransactionTraceIdentifier>

EnlistmentTraceIdentifier

<EnlistmentTraceIdentifier>

<ResourceManagerId>

string form of guid

</ResourceManagerId>

<TransactionTraceIdentifier>

<TransactionIdentifier >

string representation of transaction id

</TransactionIdentifier>

<CloneIdentifier >

the clone id number

</CloneIdentifier>

<TransactionTraceIdentifier>

<EnlistmentIdentifier>

the enlistment id number

</EnlistmentIdentifier>

</EnlistmentTraceIdentifier>

Идентификатор диспетчера ресурсов

<ResourceManagerId>

string form of guid

</ResourceManagerId>

Проблемы безопасности, связанные с трассировкой

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