Ключевым моментом, на который стоит обратить внимание, является CorrelationManager
.
Следы, сгенерированные из одного логического
операция может быть помечена с
уникальный идентификатор операции, чтобы
отличить их от следов от
другая логическая операция.
Логические операции также могут быть вложенными.
Свойство LogicalOperationStack
выставляет стек вложенных логических
операции тождества. Каждый звонок в
Метод StartLogicalOperation выдвигает
новая логическая идентификация операции на
стек. Каждый звонок в
Метод StopLogicalOperation выскакивает
логическая операция идентичности от
стек.
Итак, по сути, CorrelationManager
позволяет вам назначать информацию потоку. Эта информация может использоваться для сопоставления информации в файлах журнала. Поскольку информация находится в потоке, она доступна для входа любым способом.
Хорошо, так что я не думаю, что я развеял жаргон. :)
Вот пример:
class Program
{
static void Main(string[] args)
{
Trace.CorrelationManager.StartLogicalOperation(Guid.CreateGuid());
Trace.CorrelationManager.StartLogicalOperation("TransferMoney");
TransferMoney();
Trace.CorrelationManager.StopLogicalOperation();
Trace.CorrelationManager.StopLogicalOperation();
}
static void TransferMoney()
{
DebitAccount();
WireMoney();
}
}
Теперь, если методы DebitAccount и WireMoney регистрируют сообщения, тогда Guid (AKA Activity ID) и логическое имя операции будут записываться вместе с остальной частью сообщения.
Это может позволить вам проследить один запрос через все ваши системные уровни, отслеживая идентификатор активности. Вы также можете использовать логическое имя для анализа журналов, чтобы увидеть шаблоны использования и производительность с логической точки зрения.
На корпоративной библиотеке. Корпоративная библиотека добавит значения LogicalOperationStack в выходные данные журнала (если настроено):
LogicalOperationStack = TransferMoney,
b63e2f03-5433-40a2-9de5-6232d3aa7f68
, а также добавление каждого значения LogicalOperationStack в список категорий:
Категория: General, TransferMoney
Обратите внимание, что TraceOutputOptions
не выводятся в EventLog TraceListener. Это может свести вас с ума, если вы пытаетесь понять, почему они не появляются. :)
Корпоративная библиотека уже имеет класс Tracer
, который обеспечивает функциональность, эквивалентную приведенному выше коду (плюс возможность регистрировать сообщения трассировки с таймингами и т. Д.). Таким образом, приведенный выше код с использованием Tracer
будет:
class Program
{
static void Main(string[] args)
{
using (Tracer tracer = new Tracer("TransferMoney", Guid.NewGuid()))
{
TransferMoney();
}
}
static void TransferMoney()
{
DebitAccount();
WireMoney();
}
}