Диагностическая трассировка
Трассировка — это процесс публикации определенных сообщений, создаваемых во время выполнения. При использовании трассировки требуется механизм для сбора и записи передаваемых сообщений. Получателями сообщений трассировки являются прослушиватели. В задачу прослушивателя входит сбор, хранение и маршрутизация сообщений трассировки. Прослушиватели направляют выходные данные трассировки соответствующему целевому объекту, например, в журнал событий, окно или текстовый файл.
Один из таких прослушивателей, 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>
Проблемы безопасности, связанные с трассировкой
Если вы в качестве администратора включаете трассировку, конфиденциальная информация может быть записана в журнал трассировки, который по умолчанию доступен для общедоступного просмотра. Чтобы устранить любую возможную угрозу безопасности, следует рассмотреть возможность хранения журнала трассировки в безопасном расположении, управляемом разрешениями доступа к общей папке и файловой системе.