Подтвердить что ты не робот

Проводка WCF/трассировка и идентификация активности с использованием log4net или NLog

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

протоколирование лучших практик

log4net vs TraceSource

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

Запись в .NET 3.5

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

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

См. нижнюю часть этого сообщения для нескольких вопросов о ServiceTraceViewer,

END EDIT.

Тема моего вопроса подробно не обсуждается ни в одном из этих сообщений. Меня интересует, что делают люди в отношении ведения журнала и WCF. Если вы работаете над проектом, который включает службы WCF, и вы регистрируетесь в своем проекте, предпринимаете ли вы какие-либо особые усилия для использования специфичных для WCF возможностей ведения журнала. В частности, вы пытаетесь включить такие вещи, как Activity Tracing, распространение активности и трассировка от конца до конца? Как указано в этой статье из 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 и установки ее свойства propagateActivity в значение "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 реализована аналогично, все сообщения, зарегистрированные во время вызова службы, также будут регистрироваться (хотя, возможно, в отдельном файле) и помечены одним и тем же идентификатором активности. Таким образом, можно будет сопоставить сообщения протоколирования в файле журнала "службы" с соответствующими сообщениями в журнале "клиент".

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

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

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

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

4b9b3361

Ответ 1

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

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

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;

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

[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
}

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

Ответ 2

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

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

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