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