servicio - Registro/rastreo de WCF y propagación de ID de actividad utilizando log4net o NLog
puede deberse a que el enlace del extremo de servicio no usa el protocolo http wcf (2)
He visto muchas otras preguntas sobre el registro. Mejores prácticas. ¿Qué plataforma de registro es mejor. Etc. Aquí hay algunos enlaces de aquí en SO con muy buenas discusiones sobre el tema:
La mejor solución de registro para el proyecto .NET 3.5
EMPIEZA A EDITAR:
Habiendo escrito este largo post, supongo que lo más importante que estoy tratando de averiguar es cuán estrechamente acoplados están el registro / rastreo de WCF y la propagación de la actividad de identificación a System.Diagnostics y TraceSources. ¿Puede obtener un registro / rastreo de WCF "bueno" y propagación de ID de actividad utilizando una plataforma de registro de terceros como log4net o NLog? Si haces esto, ¿cómo lo haces?
Vea la parte inferior de esta publicación para algunas preguntas sobre ServiceTraceViewer,
EDICIÓN FINAL.
El tema de mi pregunta no se discute con mucho detalle en ninguna de estas publicaciones. Estoy interesado en lo que la gente está haciendo con respecto al registro y WCF. Si está trabajando en un proyecto que incluye servicios de WCF y ha iniciado sesión en su proyecto, ¿hace algún esfuerzo especial para usar las capacidades de registro específicas de WCF? En particular, ¿intenta incorporar cosas como el Seguimiento de actividades, la propagación de actividades y el seguimiento de extremo a extremo? Como se describe en this artículo de MSDN. Here hay otro artículo de MSDN sobre actividades de propagación.
Los artículos explican cómo realizar el seguimiento de actividades, la propagación de actividades y el seguimiento de extremo a extremo utilizando System.Diagnostics TraceSources. Muestra cómo configurar WCF para "activar" estas opciones a través del archivo app.config / web.config. WCF utiliza TraceSources internamente para registrar los resultados de la comunicación.
Aquí hay un código de ejemplo (del segundo artículo de MSDN vinculado anteriormente) que muestra más o menos cómo lograr la propagación de la actividad a través de System.Diagnostics y 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;
Aquí hay una forma de saber, desde un servicio, si WCF ha propagado una actividad o no:
// 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;
De todos los ejemplos que he visto, la propagación de la actividad se logra configurando (generalmente a través de app.config) el modelo de Sistema de Servicio de TraceSource y configurando su propiedad propagateActivity en "true". Las actividades se propagan en realidad estableciendo el ID de actividad (guid) en Trace.CorrelationManager.ActivityId. ¿Se pueden usar eficazmente el registro de WCF y la propagación de actividades si está utilizando log4net o NLog?
Mi proyecto utilizará mucho WCF. Actualmente estamos intentando instalarnos en nuestra solución de registro. Creo que tengo una buena comprensión de cómo funciona el registro de WCF y la propagación de actividades con System.Diagnostics y TraceSources. Me gustaría entender mejor cómo / si se puede lograr algo similar con plataformas de registro como log4net y NLog.
¿Proporcionan algún apoyo "nativo"? Parece un poco más probable que proporcionen alguna infraestructura para que la propagación de la actividad pueda lograrse "manualmente". Tal vez algo como esto:
//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;
Si el formato de registro log4net / NLog está configurado para registrar la parte superior de la pila NDC, cada mensaje registrado por el cliente (mientras la actividad está dentro del alcance) se "etiquetará" con la identificación de la actividad. Suponiendo que el servicio WCF se implementa de manera similar, todos los mensajes registrados durante la llamada de servicio también se registrarán (aunque probablemente en un archivo separado) y se etiquetarán con la misma ID de actividad. Por lo tanto, será posible correlacionar los mensajes de registro en el archivo de registro de "servicio" con los mensajes correspondientes en el registro de "cliente".
Entonces, si usa WCF y tiene registro, aquí hay algunas preguntas:
- ¿Utilizas la propagación de actividades?
- ¿Utilizas TraceSources para el registro?
- ¿Utiliza alguna otra plataforma de registro (por ejemplo, log4net, NLog)?
- Si usa otra plataforma de registro, ¿cómo hace la propagación de la actividad?
- ¿Utiliza una combinación de registro de terceros (log4net / NLog - para la mayoría del registro) y
System.Diagnostics.TraceSource
(para el registro de límites de servicio de WCF)?
¿Qué pasa con ServiceTraceViewer? ¿Lo usas? La mayoría de los ejemplos que he visto muestran la salida generada por System.Diagnostics a través de TraceSources y XmlTraceListener. ¿Puede consumir resultados de log4net, NLog, etc.? ¿Funciona "mejor" con el registro basado en TraceSource? Si es así, ¿es "suficientemente bueno" tener solo un poco de registro basado en TraceSource en los límites del servicio WCF (capturando parte del contexto de la aplicación, así como la información de comunicación de WCF) para ver en ServiceTraceViewer? He usado ServiceTraceViewer brevemente, como parte de mi proceso de aprendizaje continuo de WCF.
Si llegaste tan lejos, gracias por leer. Tal vez estoy pensando demasiado en la integración completa del registro, la propagación de la actividad de WCF y la capacidad de ver los registros en ServiceTraceViewer. Parece una consideración importante en la elección de la plataforma de registro y / o las estrategias de registro, pero no tengo suficiente experiencia con estas plataformas de registro o WCF para saberlo con seguridad.
El artículo en CodeProject describe cómo rastrear las actividades con NLog mediante la creación de un renderizador y escucha personalizado, y especifica qué iniciar sesión en la configuración.
El código fuente de las extensiones Nlog se puede encontrar en http://lowleveldesign.codeplex.com/releases/view/96938
Descargo de responsabilidad: no he probado la solución, solo planeo usarla.
Solo el valor de mi centavo, uso el registro basado en AOP que escribo / mantengo, pero es como algunos de los otros marcos de registro ... El mío se basa en decoradores, pero puedo extenderlo a cualquier cosa que aparezca en la pila de llamadas.
Entonces, donde tienes algo como esto:
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;
Si tenía algo como esto en el servidor, entonces el mío funciona en ese sentido, pero mi método no funciona de esta manera para el registro interno. El mío está configurado para hacer esto:
[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
}
Además, ¿está buscando tener un registro correlacionado entre el cliente y el servidor? ¿Cómo negociar esos dos? ¿Cómo puedes asegurarte de que uno esté relacionado con el otro?