Журналирование / отслеживание WCF и распространение идентификатора активности с использованием log4net или NLog - PullRequest
21 голосов
/ 09 сентября 2010

Я видел много других вопросов по ведению журнала. Лучшие практики. Какая платформа для регистрации лучше? И т.д. Вот несколько ссылок здесь на SO с очень хорошими обсуждениями по теме:

регистрация лучших практик

log4net против TraceSource

лучшее решение для ведения журнала для проекта .NET 3.5

.NET 3.5 logging

НАЧАТЬ РЕДАКТИРОВАТЬ:

Напечатав этот длинный пост, я думаю, что главное, что я пытаюсь выяснить, - это насколько тесно связаны журналирование / отслеживание WCF и распространение идентификатора активности с System.Diagnostics и TraceSources. Можете ли вы получить «хорошие» журналирование / отслеживание WCF и распространение идентификатора активности, используя стороннюю платформу журналирования, такую ​​как log4net или NLog. Если вы делаете это, как вы это делаете?

См. В нижней части этого поста несколько вопросов о ServiceTraceViewer,

КОНЕЦ РЕДАКТИРОВАНИЯ.

Тема моего вопроса не обсуждается достаточно подробно ни в одном из этих постов. Я интересуюсь тем, что люди делают относительно регистрации и WCF. Если вы работаете над проектом, который включает службы WCF, и у вас есть вход в свой проект, вы предпринимаете какие-то особые усилия, чтобы использовать возможности ведения журналов, характерные для WCF. В частности, пытаетесь ли вы включить такие вещи, как отслеживание действий, распространение действий и сквозное отслеживание? Как указано в этой статье из MSDN. Здесь - еще одна статья из MSDN о пропаганде деятельности.

В статьях рассказывается, как выполнять трассировку активности, распространение активности и сквозную трассировку с помощью System.Diagnostics TraceSources. В нем показано, как настроить WCF для «включения» этих параметров через файл app.config / web.config. WCF использует TraceSources для регистрации результатов общения.

Вот пример кода (из второй статьи MSDN, связанной выше), который более или менее показывает, как добиться распространения активности с помощью System.Diagnostics и TraceSources:

TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Вот способ, которым вы можете сказать, изнутри службы, распространял ли WCF действие:

// Check if an activity was set in scope by WCF, i.e., if it was 
// propagated from the client. If not, i.e., ambient activity is 
// equal to Guid.Empty, create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
    Guid newGuid = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add " 
                        + n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;

Из всех примеров, которые я видел, распространение активности достигается путем настройки (как правило, через app.config) модели TraceSource модели System.Service и установки для ее свойстваvelopateActivity значения «true». Действия на самом деле распространяются путем установки идентификатора активности (guid) на Trace.CorrelationManager.ActivityId. Можно ли эффективно использовать ведение журнала WCF и распространение активности, если вы используете log4net или NLog?

Мой проект будет очень интенсивно использовать WCF. В настоящее время мы пытаемся выбрать наше решение для ведения журнала. Я думаю, что у меня есть довольно хорошее понимание того, как журналирование WCF и распространение активности работают с System.Diagnostics и TraceSources. Я хотел бы лучше понять, как / если нечто подобное может быть достигнуто с помощью таких платформ журналирования, как log4net и NLog.

Они предоставляют некоторую "нативную" поддержку? Кажется немного более вероятным, что они предоставляют некоторую инфраструктуру, чтобы распространение активности могло быть достигнуто «вручную». Может быть, что-то вроде этого:

//Inside client code:
ILog logger = LogManager.GetLogger("client");
Guid oldActivity = Trace.CorrelationManager.ActivityId;
if (oldActivity == Guid.Empty)
{
  Trace.CorrelationManager.ActivityId = Guid.NewGuid();
}

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId))
{
  log.Info("Before calling WCF Service");

  wcfService.Method();

  log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

Если формат ведения журнала log4net / NLog сконфигурирован для регистрации вершины стека NDC, то каждое сообщение, зарегистрированное клиентом (пока действие находится в области действия), будет «помечено» идентификатором действия. Если предположить, что служба WCF реализована аналогичным образом, то все сообщения, зарегистрированные во время вызова службы, также будут записаны (хотя, возможно, в отдельном файле) и помечены с тем же идентификатором активности. Таким образом, будет возможно соотнести сообщения регистрации в файле журнала «service» с соответствующими сообщениями в журнале «client».

Итак, если вы используете WCF и у вас есть логирование, вот несколько вопросов:

  1. Используете ли вы распространение деятельности?
  2. Используете ли вы TraceSources для регистрации?
  3. Используете ли вы какую-либо другую платформу для ведения журналов (например, log4net, NLog)?
  4. Если вы используете другую платформу для ведения журналов, как вы делаете распространение активности?
  5. Используете ли вы сочетание сторонних журналов (log4net / NLog - для большинства журналов) и System.Diagnostics.TraceSource (для журналирования границ службы WCF)?

А как насчет ServiceTraceViewer? Вы используете это? Большинство примеров, которые я видел, показывают, что вывод, генерируемый System.Diagnostics через TraceSources и XmlTraceListener. Может ли он использовать выходные данные из log4net, NLog и т. Д.? Работает ли "лучше" с ведением журнала на основе TraceSource? Если это так, достаточно ли это, чтобы иметь лишь небольшую часть регистрации на основе TraceSource на границах службы WCF (захвата некоторого контекста приложения, а также информации о связи WCF) для просмотра в ServiceTraceViewer? Я использовал ServiceTraceViewer кратко, как часть моего текущего процесса обучения WCF.

Если вы зашли так далеко, спасибо, что прочитали. Возможно, я переосмысливаю всю интеграцию ведения журналов, распространения активности WCF и возможности просмотра журналов в ServiceTraceViewer. Это кажется важным соображением при выборе платформы ведения журнала и / или стратегии ведения журнала, но у меня недостаточно опыта работы с этими платформами ведения журнала или WCF, чтобы точно знать.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

Достаточно моих никелей, я использую протоколирование на основе AOP, которое я пишу / поддерживаю самостоятельно, но это как некоторые другие каркасы журналирования ... Мой основан на декораторах, но я могу расширить его на все, что попадает в стек вызовов.

Итак, где у вас есть что-то вроде этого:

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId)) {
  log.Info("Before calling WCF Service");

  wcfService.Method();

  log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

Если у вас было что-то подобное на сервере, то мой работает в этом отношении, но мой метод не работает таким образом длявнутренняя регистрация.Мой настроен для этого:

[LogMethod( CaptureDirection = LoggingDirection.InOut /*Optional*/, CaptureVariables = Yes /*Optional*/ )]
public ClassName MyMethodName(params){
  //magic logging happens here on method entry

  DoSomething();

  //if you need logging here I can't do anything with my AOP system

  DoSomethingElse();


  //magic logging happens here on method exit
}

Кроме того, вы ищете коррелированную запись в журнал между клиентом и сервером?Как вы ведете переговоры с этими двумя?Как вы можете убедиться, что одно связано с другим?

0 голосов
/ 25 июня 2013

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

Можно найти исходный код расширений Nlog.на http://lowleveldesign.codeplex.com/releases/view/96938

Отказ от ответственности: я не пробовал решение, только планирую его использовать.

...