Mejores prácticas de registro

Me gustaría obtener historias sobre cómo las personas manejan el rastreo y el inicio de sesión en aplicaciones reales. Aquí hay algunas preguntas que pueden ayudar a explicar su respuesta.

Frameworks

¿Qué marcos usas?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • Bloque de aplicación de registro
  • ¿Otro?

Si usa el rastreo, ¿utiliza Trace.Correlation.StartLogicalOperation?

¿Escribes este código manualmente, o usas alguna forma de progtwigción orientada a aspectos para hacerlo? ¿Te importa compartir un fragmento de código?

¿Proporciona alguna forma de granularidad sobre las fonts de trazas? Por ejemplo, WPF TraceSources le permite configurarlos en varios niveles:

  • System.Windows – configuración para todos WPF
  • System.Windows.Animation: anula específicamente para Animación.

Oyentes

¿Qué salidas de registro usas?

  • Archivos de texto
  • Archivos XML
  • Registro de eventos
  • ¿Otro?

Si usa archivos, ¿usa registros continuos o solo un archivo? ¿Cómo se hacen los registros disponibles para que las personas consumn?

Visita

¿Qué herramientas usas para ver los registros?

  • Bloc
  • Cola
  • Visor de eventos
  • Gerente de Operaciones del Centro de Sistemas / Gerente de Operaciones de Microsoft
  • WCF Service Trace Viewer
  • ¿Otro?

Si está creando una solución ASP.NET, ¿también utiliza ASP.NET Health Monitoring? ¿Incluye salida de rastreo en los eventos del monitor de estado? ¿Qué pasa con Trace.axd?

¿Qué hay de los contadores de rendimiento personalizados?


    Actualización: para extensiones de System.Diagnostics, proporcionando algunos de los oyentes faltantes que podría desear, vea Essential.Diagnostics en CodePlex ( http://essentialdiagnostics.codeplex.com/ )


    Frameworks

    P: ¿Qué marcos usas?

    A: System.Diagnostics.TraceSource, integrado en .NET 2.0.

    Proporciona un registro poderoso, flexible y de alto rendimiento para las aplicaciones, sin embargo, muchos desarrolladores desconocen sus capacidades y no las usan al máximo.

    Hay algunas áreas donde la funcionalidad adicional es útil, o a veces la funcionalidad existe pero no está bien documentada, sin embargo, esto no significa que todo el marco de trabajo de registro (que está diseñado para ser extensible) debe descartarse y reemplazarse por completo como algunas alternativas populares (NLog, log4net, Common.Logging e incluso EntLib Logging).

    En lugar de cambiar la manera de agregar declaraciones de registro a su aplicación y reinventar la rueda, acaba de ampliar el marco de System.Diagnostics en los pocos lugares que lo necesita.

    Me parece que los otros frameworks, incluso EntLib, simplemente sufren del Síndrome de No Inventado Aquí, y creo que han perdido el tiempo reinventando los conceptos básicos que ya funcionan perfectamente en System.Diagnostics (por ejemplo, cómo se escriben los enunciados de registro), en lugar de llenar los pocos vacíos que existen. En resumen, no los use, no son necesarios.

    Características que puede que no haya conocido:

    • El uso de las sobrecargas de TraceEvent que toman una cadena de formato y args puede ayudar al rendimiento ya que los parámetros se mantienen como referencias separadas hasta después de que Filter.ShouldTrace () haya tenido éxito. Esto significa que no habrá costosas llamadas a ToString () en los valores de los parámetros hasta que el sistema haya confirmado que el mensaje realmente se registrará.
    • El Trace.CorrelationManager le permite correlacionar declaraciones de registro sobre la misma operación lógica (ver a continuación).
    • VisualBasic.Logging.FileLogTraceListener es bueno para escribir en archivos de registro y admite la rotación de archivos. Aunque en el espacio de nombres de VisualBasic, puede utilizarse con la misma facilidad en un proyecto de C # (u otro idioma) simplemente incluyendo la DLL.
    • Al utilizar EventLogTraceListener si llama a TraceEvent con varios argumentos y con cadena de formato vacía o nula, los argumentos se pasan directamente a EventLog.WriteEntry () si está utilizando recursos de mensajes localizados.
    • La herramienta Service Trace Viewer (de WCF) es útil para ver gráficos de archivos de registro correlacionados de actividad (incluso si no está utilizando WCF). Esto realmente puede ayudar a depurar problemas complejos donde se involucran múltiples hilos / actividades.
    • Evite sobrecargar borrando a todos los oyentes (o eliminando el valor predeterminado); de lo contrario, Default pasará todo al sistema de seguimiento (e incurrirá en todos los gastos generales de ToString ()).

    Las áreas en las que le gustaría consultar se extienden (si es necesario):

    • Escucha de rastreo de base de datos
    • Oyente de seguimiento de color de la consola
    • Escuchas de seguimiento MSMQ / Email / WMI (si es necesario)
    • Implemente un FileSystemWatcher para llamar a Trace.Refresh para cambios de configuración dinámica

    Otras recomendaciones:

    Use identificadores de eventos estructurados y mantenga una lista de referencias (por ejemplo, documentarlos en una enumeración).

    Tener identificadores de eventos únicos para cada evento (significativo) en su sistema es muy útil para correlacionar y encontrar problemas específicos. Es fácil realizar un seguimiento del código específico que registra / utiliza los identificadores de eventos, y puede facilitar la orientación de errores comunes, por ejemplo, el error 5178 significa que la cadena de conexión de la base de datos es incorrecta, etc.

    Los identificadores de evento deben seguir algún tipo de estructura (similar a la Teoría de códigos de respuesta utilizada en el correo electrónico y HTTP), que le permite tratarlos por categoría sin conocer códigos específicos.

    ej. El primer dígito puede detallar la clase general: 1xxx se puede usar para operaciones de “inicio”, 2xxx para el comportamiento normal, 3xxx para rastreo de actividad, 4xxx para advertencias, 5xxx para errores, 8xxx para operaciones de “detención”, 9xxx para errores fatales, etc.

    El segundo dígito puede detallar el área, por ejemplo 21xx para información de la base de datos (41xx para advertencias de base de datos, 51xx para errores de base de datos), 22xx para el modo de cálculo (42xx para advertencias de cálculo, etc.), 23xx para otro módulo, etc.

    Los identificadores de eventos estructurados y asignados también te permiten usarlos en filtros.

    P: Si usa el rastreo, ¿utiliza Trace.Correlation.StartLogicalOperation?

    R: Trace.CorrelationManager es muy útil para correlacionar sentencias de registro en cualquier tipo de entorno de subprocesos múltiples (que es casi cualquier cosa en estos días).

    Necesita al menos configurar el ActivityId una vez para cada operación lógica para correlacionar.

    Start / Stop y LogicalOperationStack se puede utilizar para el contexto simple basado en la stack. Para contextos más complejos (por ejemplo, operaciones asíncronas), el uso de TraceTransfer para el nuevo ActivityId (antes de cambiarlo), permite la correlación.

    La herramienta Service Trace Viewer puede ser útil para ver gráficos de actividad (incluso si no está utilizando WCF).

    P: ¿Escribes este código manualmente, o usas alguna forma de progtwigción orientada a aspectos para hacerlo? ¿Te importa compartir un fragmento de código?

    R: Es posible que desee crear una clase de ámbito, por ejemplo, LogicalOperationScope, que (a) configure el contexto cuando se cree y (b) restablezca el contexto cuando se elimine.

    Esto le permite escribir código como el siguiente para ajustar automáticamente las operaciones:

    using( LogicalOperationScope operation = new LogicalOperationScope("Operation") ) { // .. do work here } 

    En la creación, el scope podría establecer primero ActivityId si fuera necesario, llamar a StartLogicalOperation y luego registrar un mensaje TraceEventType.Start. En Dispose, podría registrar un mensaje de detención y luego llamar a StopLogicalOperation.

    P: ¿Proporciona alguna forma de granularidad sobre las fonts de rastreo? Por ejemplo, WPF TraceSources le permite configurarlos en varios niveles.

    R: Sí, múltiples fonts de rastreo son útiles / importantes a medida que los sistemas crecen.

    Si bien es probable que desee registrar constantemente todas las advertencias y más, o toda la información y los mensajes anteriores, para cualquier sistema de tamaño razonable, el volumen de seguimiento de actividad (inicio, detención, etc.) y el registro detallado simplemente se convierte en demasiado.

    En lugar de tener solo un interruptor que lo active o desactive, es útil poder activar esta información para una sección de su sistema a la vez.

    De esta forma, puede localizar problemas significativos del registro usualmente (todas las advertencias, errores, etc.) y luego “acercar” las secciones que desee y configurarlas en el Rastreo de la actividad o incluso en los niveles de depuración.

    La cantidad de fonts de rastreo que necesita depende de su aplicación; por ejemplo, puede desear una fuente de rastreo por conjunto o por sección principal de su aplicación.

    Si necesita un control aún más preciso, agregue interruptores booleanos individuales para activar / desactivar el rastreo específico de alto volumen, por ejemplo, volcados de mensajes sin formato. (O una fuente de rastreo separada podría ser utilizada, similar a WCF / WPF).

    También es posible que desee considerar orígenes de rastreo separados para el seguimiento de actividad frente al registro general (otros), ya que puede hacer que sea un poco más fácil configurar los filtros exactamente como los quiere.

    Tenga en cuenta que los mensajes aún se pueden correlacionar a través de ActivityId, incluso si se usan diferentes fonts, así que use tantas como necesite.


    Oyentes

    P: ¿Qué salidas de registro usas?

    Esto puede depender del tipo de aplicación que está escribiendo y de las cosas que se registran. Por lo general, diferentes cosas van en diferentes lugares (es decir, salidas múltiples).

    Generalmente clasifico los productos en tres grupos:

    (1) Eventos: registro de eventos de Windows (y archivos de rastreo)

    Por ejemplo, si escribe un servidor / servicio, la mejor práctica en Windows es usar el Registro de eventos de Windows (no tiene una IU a la que informar).

    En este caso, todos los eventos de información fatal, error, advertencia y (nivel de servicio) deben ir al registro de eventos de Windows. El nivel de información debe reservarse para este tipo de eventos de alto nivel, los que desea ir en el registro de eventos, por ejemplo, “Servicio iniciado”, “Servicio detenido”, “Conectado a Xyz”, y tal vez incluso “Progtwig iniciado” , “Usuario conectado”, etc.

    En algunos casos, es posible que desee escribir en el registro de eventos una parte incorporada de su aplicación y no a través del sistema de rastreo (es decir, escribir las entradas del Registro de eventos directamente). Esto significa que no se puede apagar accidentalmente. (Tenga en cuenta que también desea tener en cuenta el mismo evento en su sistema de seguimiento para que pueda correlacionar).

    Por el contrario, una aplicación de GUI de Windows generalmente informaría al usuario (aunque también puede iniciar sesión en el Registro de eventos de Windows).

    Los eventos también pueden tener contadores de rendimiento relacionados (por ejemplo, número de errores / seg), y puede ser importante coordinar cualquier escritura directa al registro de eventos, contadores de rendimiento, escribir en el sistema de rastreo e informar al usuario para que ocurran a al mismo tiempo.

    es decir, si un usuario ve un mensaje de error en un momento determinado, debería poder encontrar el mismo mensaje de error en el Registro de eventos de Windows y luego el mismo evento con la misma marca de tiempo en el registro de seguimiento (junto con otros detalles de rastreo).

    (2) Actividades – Archivos de registro de aplicación o tabla de base de datos (y archivos de rastreo)

    Esta es la actividad habitual de un sistema, por ejemplo, la página web servida, el comercio bursátil alojado, el pedido realizado, el cálculo realizado, etc.

    El seguimiento de actividad (inicio, parada, etc.) es útil aquí (en la granualidad correcta).

    Además, es muy común utilizar un registro de aplicación específico (a veces llamado registro de auditoría). Por lo general, esta es una tabla de base de datos o un archivo de registro de la aplicación y contiene datos estructurados (es decir, un conjunto de campos).

    Las cosas pueden ser un poco borrosas aquí dependiendo de su aplicación. Un buen ejemplo podría ser un servidor web que escribe cada solicitud en un registro web; ejemplos similares podrían ser un sistema de mensajería o un sistema de cálculo donde cada operación se registra junto con detalles específicos de la aplicación.

    Un ejemplo no tan bueno es el comercio bursátil o un sistema de pedidos de ventas. En estos sistemas, probablemente ya esté iniciando la actividad, ya que tienen un importante valor comercial, sin embargo, el principio de correlacionarlos con otras acciones sigue siendo importante.

    Además de los registros de aplicaciones personalizadas, las actividades también suelen tener contadores de rendimiento relacionados, por ejemplo, número de transacciones por segundo.

    En general, debe coordinar el registro de actividades en diferentes sistemas, es decir, escribir en el registro de la aplicación al mismo tiempo que aumenta su contador de rendimiento y se registra en su sistema de rastreo. Si lo hace todo al mismo tiempo (o directamente uno después del otro en el código), entonces los problemas de depuración son más fáciles (que si todos ocurren en momentos / ubicaciones diferentes en el código).

    (3) Debug Trace – archivo de texto, o tal vez XML o base de datos.

    Esta es la información en el nivel Verbose y más baja (por ejemplo, conmutadores booleanos personalizados para activar / desactivar los volcados de datos brutos). Esto proporciona las agallas o los detalles de lo que está haciendo un sistema en un nivel de subactividad.

    Este es el nivel que desea activar / desactivar para las secciones individuales de su aplicación (de ahí las múltiples fonts). No quiere que estas cosas abarroten el registro de eventos de Windows. A veces se usa una base de datos, pero es más probable que se lancen archivos de registro que se purgan después de un cierto tiempo.

    Una gran diferencia entre esta información y un archivo de registro de aplicación es que no está estructurada. Mientras que un Registro de Aplicación puede tener campos para A, De, Cantidad, etc., los rastros de depuración Verbose pueden ser lo que el progtwigdor ponga, por ejemplo, “verificar valores X = {valor}, Y = falso”, o comentarios / marcadores aleatorios como ” Hecho, intentando de nuevo “.

    Una práctica importante es asegurarse de que las cosas que coloca en los archivos de registro de la aplicación o el Registro de eventos de Windows también se registran en el sistema de rastreo con los mismos detalles (por ejemplo, marca de tiempo). Esto le permite correlacionar los diferentes registros al investigar.

    Si planea utilizar un visor de registro particular porque tiene una correlación compleja, por ejemplo, el Visor de rastreo de servicio, entonces necesita usar un formato apropiado, es decir, XML. De lo contrario, un archivo de texto simple suele ser lo suficientemente bueno: en los niveles inferiores la información no está estructurada, por lo que puede encontrar volcados de matrices, depósitos de stack, etc. Siempre que pueda correlacionarse a registros más estructurados en niveles superiores, las cosas deberían estar bien.

    P: Si usa archivos, ¿usa registros continuos o solo un archivo? ¿Cómo se hacen los registros disponibles para que las personas consumn?

    R: En el caso de los archivos, generalmente quiere que los archivos de registro se muevan desde un punto de vista de manejabilidad (con System.Diagnostics simplemente use VisualBasic.Logging.FileLogTraceListener).

    La disponibilidad nuevamente depende del sistema. Si solo está hablando de archivos, entonces para un servidor / servicio, solo se puede acceder a los archivos cuando sea necesario. (Los registros de eventos de Windows o de la aplicación de base de datos tendrían sus propios mecanismos de acceso).

    Si no tiene fácil acceso al sistema de archivos, puede ser más fácil realizar un seguimiento de depuración en una base de datos. [es decir, implementar una base de datos TraceListener].

    Una solución interesante que vi para una aplicación GUI de Windows fue que registraba información de seguimiento muy detallada en una “grabadora de vuelo” mientras se ejecutaba y luego, cuando la apagaba si no tenía problemas, simplemente borraba el archivo.

    Si, sin embargo, se bloqueó o se encontró un problema, entonces el archivo no se eliminó. O bien si detecta el error, o la próxima vez que se ejecuta, notará el archivo y luego podrá tomar medidas, por ejemplo, comprimirlo (por ejemplo, 7zip) y enviarlo por correo electrónico o ponerlo a disposición de otra forma.

    Actualmente, muchos sistemas incorporan informes automatizados de fallas a un servidor central (después de consultar con los usuarios, por ejemplo, por razones de privacidad).


    Visita

    P: ¿Qué herramientas usas para ver los registros?

    R: Si tiene varios registros por diferentes razones, entonces usará varios lectores.

    Notepad / vi / Notepad ++ o cualquier otro editor de texto es básico para los registros de texto sin formato.

    Si tiene operaciones complejas, por ejemplo, actividades con transferencias, obviamente, usted usaría una herramienta especializada como el Visor de Rastreo de Servicios. (Pero si no lo necesita, entonces un editor de texto es más fácil).

    Como generalmente registro información de alto nivel en el Registro de eventos de Windows, proporciona una forma rápida de obtener una visión general, de una manera estructurada (busque los bonitos icons de error / advertencia). Solo necesita comenzar a buscar archivos de texto si no hay suficiente en el registro, aunque al menos el registro le proporciona un punto de partida. (En este punto, asegurarse de que sus registros tengan entradas coordinadas se vuelve útil).

    En general, el registro de eventos de Windows también pone estos eventos importantes a disposición de las herramientas de monitoreo como MOM u OpenView.

    Otros —

    Si se registra en una base de datos, puede ser fácil filtrar y ordenar la información (por ejemplo, ampliar una identificación de actividad en particular. (Con los archivos de texto, puede usar Grep / PowerShell o similar para filtrar en el GUID particular que desee)

    MS Excel (u otro progtwig de hoja de cálculo). Esto puede ser útil para analizar información estructurada o semiestructurada si puede importarla con los delimitadores correctos para que diferentes valores entren en columnas diferentes.

    Cuando ejecuto un servicio en depuración / prueba, generalmente lo albergo en una aplicación de consola por simplicidad. Encuentro un registrador de consola de colores útil (por ejemplo, rojo para errores, amarillo para advertencias, etc.). Debe implementar un oyente de seguimiento personalizado.

    Tenga en cuenta que el marco no incluye un registrador de consola de color o un registrador de base de datos, por lo que, en este momento, tendría que escribir estos si los necesita (no es demasiado difícil).

    Realmente me molesta que varios frameworks (log4net, EntLib, etc.) hayan desperdiciado tiempo reinventando la rueda y reimplementando el registro básico, el filtrado y el registro a archivos de texto, el Registro de eventos de Windows y archivos XML, cada uno en su propio de manera diferente (las declaraciones de logs son diferentes en cada una); cada uno ha implementado su propia versión de, por ejemplo, un registrador de base de datos, cuando la mayor parte de eso ya existía y todo lo que se necesitaba era un par más de escucha de rastreo para System.Diagnostics. Habla sobre un gran desperdicio de esfuerzos duplicados.

    P: Si está creando una solución ASP.NET, ¿también utiliza ASP.NET Health Monitoring? ¿Incluye salida de rastreo en los eventos del monitor de estado? ¿Qué pasa con Trace.axd?

    Estas cosas se pueden activar / desactivar según sea necesario. Encuentro Trace.axd bastante útil para la depuración de cómo un servidor responde a ciertas cosas, pero generalmente no es útil en un entorno muy utilizado o para el seguimiento a largo plazo.

    P: ¿Qué pasa con los contadores de rendimiento personalizados?

    Para una aplicación profesional, especialmente un servidor / servicio, espero verlo completamente equipado con los contadores del Monitor de rendimiento y el registro en el Registro de eventos de Windows. Estas son las herramientas estándar en Windows y se deben usar.

    Debe asegurarse de incluir instaladores para los contadores de rendimiento y los registros de eventos que utiliza; estos deben crearse en el momento de la instalación (cuando se instala como administrador). Cuando su aplicación se ejecuta normalmente, no debería necesitar privilegios de administración (y por lo tanto no podrá crear registros faltantes).

    Esta es una buena razón para practicar el desarrollo como no administrador (tener una cuenta de administrador por separado para cuando necesite instalar servicios, etc.). Si escribe en el Registro de eventos, .NET creará automáticamente un registro perdido la primera vez que escriba; si se desarrolla como no administrador, lo detectará temprano y evitará una desagradable sorpresa cuando un cliente instale su sistema y luego no pueda usarlo porque no se está ejecutando como administrador.

    Tengo que unirme al coro recomendando log4net, en mi caso, desde un punto de vista de flexibilidad de la plataforma (escritorio .Net / Compact Framework, 32/64 bits).

    Sin embargo, envolverlo en una API de etiqueta privada es un anti-patrón importante . log4net.ILogger es la contraparte .Net de la API del contenedor Commons Logging , por lo que el acoplamiento ya está minimizado para usted, y dado que también es una biblioteca Apache, generalmente no es una preocupación porque no está renunciando a ningún control: tenedor si debes.

    La mayoría de las bibliotecas de envoltorios de casas que he visto también cometen una o más de una letanía de fallas:

    1. Usar un registrador de singleton global (o un punto de entrada estático equivalente) que pierde la resolución fina del patrón de logger-per-class recomendado para ninguna otra ganancia de selectividad.
    2. No se puede exponer el argumento de Exception opcional , lo que genera varios problemas:
      • Hace que una política de registro de excepciones sea aún más difícil de mantener, por lo que no se hace nada de forma coherente con las excepciones.
      • Incluso con una política coherente, formatear la excepción en una cadena pierde datos prematuramente. ILayout decorador personalizado de ILayout que realiza un desglose detallado de una excepción para determinar la cadena de eventos.
    3. Error al exponer las propiedades de Is Level Enabled , que descarta la capacidad de omitir el código de formato cuando las áreas o niveles de registro están desactivados.

    A menudo no desarrollo en asp.net, sin embargo, cuando se trata de los madereros, creo que muchas de las mejores prácticas son universales. Estas son algunas de mis ideas al azar sobre la tala que aprendí a lo largo de los años:

    Frameworks

    • Utilice un marco de abstracción de registrador, como slf4j (o desarrolle el propio), de modo que desacople la implementación del registrador de su API. He visto ir y venir una cantidad de marcos de registro, y es mejor que puedas adoptar uno nuevo sin mucha molestia.
    • Intente encontrar un marco que admita una variedad de formatos de salida.
    • Intenta encontrar un marco que admita plugins / filtros personalizados.
    • Use un marco que pueda ser configurado por archivos externos, para que sus clientes / consumidores puedan modificar fácilmente la salida del registro para que las aplicaciones de administración de registros comerciales puedan leerlo con facilidad.
    • Asegúrese de no excederse en los niveles de registro personalizados; de lo contrario, es posible que no pueda moverse a diferentes marcos de registro.

    Salida del registrador

    • Intente evitar los registros de estilo de XML / RSS para el inicio de sesión que podrían encontrar fallas catastróficas. Esto es importante porque si el interruptor de encendido se apaga sin que el registrador escriba la etiqueta de cierre , su registro se interrumpirá.
    • Log hilos. De lo contrario, puede ser muy difícil hacer un seguimiento del flujo de su progtwig.
    • Si tiene que internacionalizar sus registros, es posible que desee que un desarrollador solo inicie sesión en inglés (o en el idioma de su elección).
    • A veces, tener la opción de insertar instrucciones de registro en consultas SQL puede ser un salvavidas en situaciones de depuración. Como:
      - Clase invocadora: com.foocorp.foopackage.FooClass: 9021
         SELECCIONAR * FROM foo; 
    • Desea el registro a nivel de clase. Normalmente tampoco desea instancias estáticas de registradores, no vale la micro optimización.
    • Marcar y categorizar excepciones registradas a veces es útil porque no todas las excepciones se crean iguales. Por lo tanto, conocer un subconjunto de excepciones importantes es útil si tiene un monitor de registro que necesita enviar notificaciones en estados críticos.
    • Los filtros de duplicación le ahorrarán la vista y el disco duro. ¿De verdad quieres ver la misma statement de registro repetida 10 ^ 10000000 veces? ¿No sería mejor simplemente recibir un mensaje como: This is my logging statement - Repeated 100 times

    También vea esta pregunta mía .

    No estoy calificado para comentar el registro de .Net, ya que mi pan y mantequilla es Java, pero hemos tenido una migración en nuestro registro durante los últimos 8 años, es posible que encuentre una analogía útil para su pregunta.

    Comenzamos con un registrador de Singleton que utilizaba cada subproceso dentro de la JVM y establecimos el nivel de registro para todo el proceso. Esto dio como resultado registros enormes si tuvimos que depurar incluso una parte muy específica del sistema, por lo que la lección número uno es segmentar su registro.

    Nuestra encarnación actual del registrador permite múltiples instancias con una definida como la predeterminada. Podemos instanciar cualquier cantidad de registradores secundarios que tengan diferentes niveles de registro, pero la faceta más útil de esta architecture es la capacidad de crear registradores para paquetes individuales y clases simplemente cambiando las propiedades de registro. La lección número dos es crear un sistema flexible que permita anular su comportamiento sin cambiar el código.

    Estamos utilizando la biblioteca de registro de recursos comunes de Apache, que abarca Log4J.

    ¡Espero que esto ayude!

    * Editar *

    Después de leer la publicación de Jeffrey Hantin a continuación, me di cuenta de que debería haber notado en qué se ha convertido nuestro contenedor de registro interno. Ahora es esencialmente una fábrica y se usa estrictamente para obtener un registrador que trabaje utilizando el archivo de propiedades correcto (que por razones heredadas no se ha movido a la posición predeterminada). Dado que ahora puede especificar el archivo de configuración de registro en la línea de comandos, sospecho que será aún más reducido y si está iniciando una nueva aplicación, definitivamente estoy de acuerdo con su afirmación de que ni siquiera debería molestarse en envolver el registrador.

    Usamos Log4Net en el trabajo como el proveedor de registro, con un contenedor único para la instancia de registro (aunque el singleton está bajo revisión, cuestionando si son una buena idea o no).

    Lo elegimos por las siguientes razones:

    • Configuración / reconfiguración simple en varios entornos
    • Buen número de apéndices preconstruidos
    • Uno de los CMS que usamos ya lo tenía incorporado
    • Buena cantidad de niveles de registro y configuraciones a su alrededor

    Debo mencionar, esto está hablando desde un punto de vista de desarrollo de ASP.NET

    Puedo ver algunos méritos en el uso del Trace que está en el framework .NET pero no estoy totalmente de acuerdo, principalmente porque los componentes con los que trabajo no hacen realmente ninguna llamada de Trace. Lo único que uso con frecuencia es System.Net.Mail por lo que puedo decir.

    Así que tenemos una biblioteca que engloba log4net y dentro de nuestro código solo necesitamos cosas como esta:

     Logger.Instance.Warn("Something to warn about"); Logger.Instance.Fatal("Something went bad!", new Exception()); try { var i = int.Parse("Hello World"); } catch(FormatException, ex) { Logger.Instance.Error(ex); } 

    Dentro de los métodos hacemos una verificación para ver si el nivel de registro está habilitado, por lo que no tiene llamadas redundantes a la API log4net (por lo tanto, si Depuración no está habilitada, las instrucciones de depuración son ignoradas), pero cuando tengo tiempo Lo actualizaré para exponerlos para que pueda hacer los controles usted mismo. Esto evitará que las evaluaciones se realicen cuando no deberían, por ejemplo:

     Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now); 

    Esto se convertirá en:

     if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now); 

    (Ahorre un poco de tiempo de ejecución)

    Por defecto, nos registramos en dos ubicaciones:

    1. Sistema de archivos del sitio web (en una extensión de archivo no servida)
    2. Envío de correo electrónico para error y fatal

    Los archivos se procesan diariamente o 10mb (IIRC). No usamos EventLog ya que puede requerir una mayor seguridad de la que a menudo deseamos ofrecer a un sitio.

    Me parece que el Bloc de notas funciona bien para leer registros.

    ¿Qué marcos usas?

    Usamos una combinación del bloque de aplicación de registro y un asistente de registro personalizado que funciona alrededor de los bits del framework .Net. El LAB está configurado para generar archivos de registro bastante extensos, incluidos archivos de rastreo generales separados para la entrada / salida del método de servicio y archivos de error específicos para problemas inesperados. La configuración incluye fecha / hora, hilo, pId, etc. para la asistencia de depuración, así como el detalle y la stack completos de la excepción (en el caso de una excepción inesperada).

    El asistente de registro personalizado hace uso de la correlación Trace y es particularmente útil en el contexto del inicio de sesión en WF. Por ejemplo, tenemos una máquina de estado que invoca una serie de flujos de trabajo secuenciales. En cada una de estas actividades de invocación registramos el inicio (usando StartLogicalOperation) y luego al final dejamos la operación lógica con un manejador de eventos de retorno gereric.

    Esto ha resultado útil varias veces cuando se intentan depurar fallas en secuencias empresariales complejas, ya que nos permite determinar cosas como las decisiones de las twigs de If / Else, etc. más rápidamente en función de la secuencia de ejecución de la actividad.

    ¿Qué salidas de registro usas?

    Usamos archivos de texto y XML. Los archivos de texto se configuran a través del bloque de aplicaciones, pero también tenemos salidas XML de nuestro servicio WF. Esto nos permite capturar los eventos de tiempo de ejecución (persistencia, etc.), así como las excepciones genéricas de tipo comercial. Los archivos de texto son registros continuos que se activan por día y por tamaño (creo que el tamaño total de 1 MB es un punto de renovación).

    ¿Qué herramientas usas para ver los registros?

    Estamos usando Notepad y WCF Service Trace Viewer, dependiendo del grupo de salida que estamos viendo. El visor de seguimiento de servicio de WCF es realmente útil si tiene su configuración de salida correctamente y puede hacer que la lectura de la salida sea mucho más simple. Dicho esto, si sé más o menos dónde está el error de todos modos, simplemente leer un archivo de texto bien anotado también es bueno.

    Los registros se envían a un único directorio que luego se divide en subdirectores basados ​​en el servicio de origen. El directorio raíz está expuesto a través de un sitio web que tiene acceso controlado por un grupo de usuarios de soporte. Esto nos permite echar un vistazo a los registros de producción sin tener que ingresar solicitudes y pasar por largos procesos de burocracia para los datos de producción.

    Como autores de la herramienta, por supuesto usamos SmartInspect para registrar y rastrear aplicaciones .NET. Por lo general, usamos el protocolo de canalización con nombre para el registro en vivo y los archivos de registro binarios (encriptados) para los registros del usuario final. Usamos la Consola SmartInspect como visor y herramienta de monitoreo.

    En realidad, existen bastantes frameworks de registro y herramientas para .NET. Hay una descripción general y una comparación de las diferentes herramientas en DotNetLogging.com .

    Hay muchas recomendaciones geniales en las respuestas.

    Una mejor práctica general es considerar quién leerá el registro. En mi caso, será un administrador en el sitio del cliente. Entonces registro mensajes que les da algo sobre lo que pueden actuar. Por ejemplo, “No se puede inicializar la aplicación. Esto generalmente es causado por ……”

    Usamos log4net en nuestras aplicaciones web.

    La capacidad de personalizar el registro en tiempo de ejecución al cambiar el archivo de configuración XML es muy útil cuando una aplicación no funciona bien en tiempo de ejecución y necesita ver más información.

    También le permite apuntar a clases o atributos específicos para iniciar sesión. Esto es muy útil cuando tienes una idea de dónde está ocurriendo el error. Un ejemplo clásico es NHibernate en el que desea ver solo el SQL yendo a la base de datos.

    Editar:

    Escribimos todos los eventos en una base de datos y en el sistema Trace. El registro de eventos que usamos para errores o excepciones. Registramos la mayoría de los eventos en una base de datos para que podamos crear informes personalizados y permitir que los usuarios vean el registro si lo desean directamente desde la aplicación.

    En lo que se refiere a la explotación orientada a aspectos me recomendaron PostSharp en otra pregunta SO:

    Aspect Oriented Logging con Unity \ T4 \ cualquier otra cosa

    El enlace proporcionado en la respuesta merece una visita si está evaluando los marcos de registro.