Я видел много других вопросов по регистрации. Лучшие практики. Какая платформа регистрации лучше. И т.д. Вот некоторые ссылки отсюда на SO с очень хорошими обсуждениями по теме:
протоколирование лучших практик
лучшее решение для ведения журнала для проекта .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, чтобы точно знать.