2010-02-08 35 views
12

.NET le permite agregar instrucciones de seguimiento al código. Puede usar¿Cómo rastrear por categoría?

Trace.WriteLine "(Some message");

y luego defina un detector de rastreo para recopilar esos mensajes en un archivo de registro. OK hasta ahora.

Pero también se puede hacer:

Trace.WriteLine "(Algunos mensaje", "Categoría");

¿Cómo se puede configurar un filtro en app.config (es decir, .exe.config) para que solo los mensajes con un cierto valor de "Categoría" se envíen a un oyente. La documentación insinúa que puede hacer esto, pero no llega a decirle cómo, creo. Quiero definir mis propias categorías (por subsistema) y ser capaz de enrutar el rastreo a varios archivos de registro cuando sea necesario.

(Sí, sé todo sobre log4net y cómo eso puede resolver todos mis problemas).

Nick

+0

Si conoce una solución, ¿por qué no utilizarla? ¿Realmente deseas reinventar una rueda? –

+6

Es un ejercicio interesante utilizar los mecanismos incorporados en el marco y elimina la necesidad de enviar componentes adicionales. –

Respuesta

2

Usted tendrá que codificar una implementación de TraceFilter para filtrar los rastros de la categoría de cadena. De lo contrario, podría usar el método TraceEvent y luego usar EventTypeFilter para filtrar rastros según el TraceEventType.

Para modificar los filtros, utilice el archivo app.config como se describe en el ejemplo para el EventTypeFilter.

+0

TraceFilter es una clase abstracta, por lo que da un error. Se acepta SourceFilter, pero no veo cómo poner mi categoría y hacer que funcione. –

+0

Por crear, me refiero a especificar su propia derivación. Voy a editar en consecuencia. –

+1

Gracias por eso. Ahora he escrito mi propia clase de filtro que logra lo que quiero. Sin embargo, las clases de oyentes subyacentes no funcionan correctamente (y Reflector muestra una incoherencia en su implementación), así que también tuve que escribir un oyente personalizado. Sospecho que la implementación de esta área es incompleta y eso explica la falta de documentación clara de Microsoft. –

0

Después de la respuesta de Jeff con referencia a TraceEvent, utilicé TraceSource con éxito para configurar el filtrado bastante granular. Trace solo puede hacer lo que usted solicite si escribe filtros personalizados, etc., pero TraceSource puede proporcionarle lo que necesita prácticamente de manera inmediata. La publicación de Mike en http://bit.ly/dXgHa7 me dio claridad sobre cómo los conmutadores, oyentes y filtros funcionan conjuntamente con TraceSource para filtrar de manera efectiva.

0

Solo para aclarar algo aquí.

una línea como esta no funcionará:

Trace.Listeners["listener2"].Filter = new CategoryFilter("FooFilter", new List<string>(), CategoryFilterMode.DenyAllExceptAllowed); 

Porque no se puede asignar un CategoryFilter a un TraceFilter. Tipo de incompatibilidad La intención aquí (en el PO) parece tratar de lograr esto. - Lo cual, cuando se mira la aplicación.config, parece posible, pero la incompatibilidad de tipos es más clara cuando se programa mediante programación.

Para complicar el problema, y ​​tal vez el punto de confusión original en el MS Doc, es que un LogSource puede tener un TraceListener, pero un TraceListener no puede tener un CategoryFilter. Los tipos van solo de una manera, y parece que Trace tiene que estar en la parte inferior de una relación de "usado por" con respecto al resto del marco de trabajo de registro en EntLib.

Cuestiones relacionadas