Mejores prácticas de registro [cerrado]


Me gustaría obtener historias sobre cómo las personas están manejando el rastreo y el registro en aplicaciones reales. Aquí hay algunas preguntas que podrían ayudar a explicar su respuesta.

Marcos

¿Qué frameworks usas?

  • log4net
  • Sistema.Diagnostico.Trace
  • Sistema.Diagnostico.TraceSource
  • Bloque de aplicación de registro
  • ¿Otro?

Si utiliza trace, ¿hace uso de Trace?Correlación.¿Comienza la operación lógica?

¿Escribes este código manualmente, o usas algún tipo de programación orientada a aspectos para hacerlo? Atención a compartir un fragmento de código?

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

  • Sistema.Windows - configuración para todo WPF
  • Sistema.Windows.Animation - anular específicamente para la animación.

Oyentes

¿Qué registro salidas ¿utilizas?

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

Si usa archivos, ¿usa registros móviles o solo un archivo? ¿Cómo haces que los registros estén disponibles para que la gente los consuma?

Ver

¿Qué herramientas utiliza para ver los registros?

  • Bloc de notas
  • Cola
  • Visor de eventos
  • Gerente de Operaciones de Systems Center / Gerente de Operaciones de Microsoft
  • Seguimiento de servicio WCF Visor
  • ¿Otro?

Si está construyendo un ASP.NET solución, usted también utiliza ASP.NET ¿Monitoreo de Salud? ¿Incluye la salida de seguimiento en los eventos del monitor de estado? ¿Qué hay de Trace?axd?

¿Qué pasa con los contadores de rendimiento personalizados?

Author: Erik Funkenbusch, 2009-02-23

10 answers


Actualización: Para extensiones al Sistema.Diagnóstico, proporcionando algunos de los oyentes que faltan que usted podría desear, ver Esencial.Diagnóstico en CodePlex (http://essentialdiagnostics.codeplex.com/)


Marcos

P: ¿Qué frameworks usas?

R: Sistema.Diagnostico.TraceSource, integrado en. NET 2.0.

Proporciona un registro potente, flexible y de alto rendimiento para las aplicaciones, sin embargo muchas los desarrolladores no son conscientes de sus capacidades y no hacen un uso completo de ellas.

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 registro (que está diseñado para ser extensible) deba desecharse y reemplazarse por completo como algunas alternativas populares (NLog, log4net, Common.Logging, e incluso EntLib Logging).

En lugar de cambiar la forma de agregar registrar declaraciones en su aplicación y reinventar la rueda, solo extendió el Sistema.Marco de diagnóstico en los pocos lugares que lo necesita.

Me parece que los otros marcos, incluso EntLib, simplemente sufren de Síndrome No Inventado Aquí, y creo que han perdido tiempo reinventando los conceptos básicos que ya funcionan perfectamente bien en el Sistema.Diagnósticos (como la forma de escribir declaraciones de registro), en lugar de llenar los pocos vacíos que existen. En resumen, no los uses they no lo son necesario.

Características que puede no haber 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 del Filtro.ShouldTrace () ha tenido éxito. Esto significa que no se registrarán llamadas costosas a toString() en valores de parámetros hasta que el sistema haya confirmado el mensaje.
  • El Rastro.CorrelationManager le permite correlacionar declaraciones de registro sobre el mismo operación lógica (ver abajo).
  • VisualBasic.Tala.FileLogTraceListener es bueno para escribir en archivos de registro y admite la rotación de archivos. Aunque en el espacio de nombres VisualBasic, se puede usar con la misma facilidad en un proyecto de C# (u otro lenguaje) simplemente incluyendo el DLL.
  • Al usar EventLogTraceListener si llama a TraceEvent con varios argumentos y con una cadena de formato vacío o nulo, entonces los argumentos se pasan directamente al EventLog.WriteEntry() si está usando recursos de mensajes localizados.
  • La herramienta Service Trace Viewer (de WCF) es útil para ver gráficos de archivos de registro de actividad correlacionados (incluso si no está utilizando WCF). Esto realmente puede ayudar a depurar problemas complejos donde están involucrados múltiples hilos/actividades.
  • Evite los overhead borrando todos los oyentes (o eliminando Default); de lo contrario Default pasará todo al sistema de rastreo (e incurrirá en todos esos overheads de toString ()).

Áreas que podrías querer mira la extensión (si es necesario):

  • Rastreador de base de datos
  • Escucha de seguimiento de consola de color
  • MSMQ / Email / WMI trace listeners (si es necesario)
  • Implementa un FileSystemWatcher para llamar a Trace.Actualizar para cambios dinámicos de configuración

Otras Recomendaciones:

Use id de evento estructurados y mantenga una lista de referencias (por ejemplo, documéntelos en una enumeración).

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

ID de evento debe seguir algún tipo de estructura (similar a la Teoría de los Códigos de Respuesta utilizados en el correo electrónico y HTTP), que le permite tratarlos por categoría sin conocer códigos específicos.

Por ejemplo, el el primer dígito puede detallar la clase general: 1xxx se puede usar para operaciones 'Start', 2xxx para comportamiento normal, 3xxx para rastreo de actividad, 4xxx para advertencias, 5xxx para errores, 8xxx para operaciones 'Stop', 9xxx para errores fatales, etc.

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

Asignado, estructurado los id de evento también te permiten usarlos en filtros.

P: Si utiliza trace, ¿hace uso de Trace?Correlación.¿Comienza la operación lógica?

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

Necesita al menos establecer el ActivityID una vez para cada operación lógica con el fin de correlacionar.

Start / Stop y el LogicalOperationStack se pueden utilizar para un contexto simple basado en pila. Para contextos más complejos (por ejemplo, operaciones asíncronas), usar TraceTransfer al 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 programación orientada a aspectos para hacerlo? Atención a compartir un fragmento de código?

R: Es posible que desee crear una clase scope, p. ej. LogicalOperationScope, que (a) establece el contexto cuando se crea y (b) restablece el contexto cuando se dispone.

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 ámbito primero podría establecer ActivityID si es necesario, llamar a StartLogicalOperation y luego registrar un TraceEventType.Mensaje de inicio. En Dispose podría registrar un mensaje de parada, y luego llamar a StopLogicalOperation.

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

R: Sí, múltiples fuentes de rastreo son útiles / importantes a medida que los sistemas se hacen más grandes.

Si bien es probable que desee registrar consistentemente todas las Advertencias y mensajes anteriores, o todos los mensajes de Información y anteriores, para cualquier sistema de tamaño razonable, el volumen de Seguimiento de Actividad (Inicio, Parada, etc.) y el registro detallado simplemente se vuelve demasiado.

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

De esta manera, puede localizar problemas significativos desde el registro habitual (todas las advertencias, errores, etc.), y luego "acercar" las secciones que desee y establecerlas en Seguimiento de actividad o incluso niveles de depuración.

El número de fuentes de seguimiento que necesita depende de su aplicación, por ejemplo, es posible que desee una fuente de seguimiento por ensamblaje o por sección principal de su aplicación.

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

Es posible que también desee considerar fuentes de seguimiento separadas para el Seguimiento de actividades frente a registros generales (otros), ya que puede hacer que sea un poco más fácil configurar los filtros exactamente como los desea.

Tenga en cuenta que los mensajes todavía se pueden correlacionar a través de ActivityID incluso si diferentes fuentes son usado, así que usa tantos como necesites.


Oyentes

P: ¿Qué salidas de registro utiliza?

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

Generalmente clasifico las salidas en tres grupos:

(1) Eventos-Registro de eventos de Windows (y archivos de seguimiento)

Por ejemplo, si escribe un servidor / servicio, entonces las mejores prácticas en Windows es usar el Registro de eventos de Windows (no tiene una interfaz de usuario a la que informar).

En este caso, todos los eventos Fatales, de Error, de Advertencia y de Información (a 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, "Service Started", "Service Stopped", "Connected to Xyz", y tal vez incluso "Schedule Initiated", "User Loged On", etc.

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

En contraste, una aplicación GUI de Windows generalmente reportaría esto al usuario (aunque también pueden registrar 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 en el Registro de eventos, contadores de rendimiento, escritura en el sistema de seguimiento e informes al usuario para que ocurran 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 seguimiento).

(2) Actividades-Archivos de registro de aplicaciones o base de datos tabla (y archivos de seguimiento)

Esta es la actividad regular que realiza un sistema, por ejemplo, página web servida, comercio bursátil alojado, orden tomada, cálculo realizado, etc.

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

Además, es muy común usar 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 aplicación y contiene datos estructurados (es decir, un conjunto de campo).

Las cosas pueden ponerse 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 son las operaciones del mercado de valores o un sistema de pedidos de ventas. En estos sistemas, probablemente ya esté registrando la actividad, ya que tienen un valor comercial importante, sin embargo, principal de correlacionarlos con otras acciones sigue siendo importante.

Además de los registros de aplicaciones personalizados, las actividades también a menudo tienen contadores de rendimiento relacionados, por ejemplo, el 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 el contador de rendimiento y el registro en el sistema de seguimiento. Si usted hace todo al mismo tiempo (o directamente uno después del otro en el código), entonces los problemas de depuración es más fácil (que si todos ocurren en diferentes momentos/ubicaciones en el código).

(3) Depurar archivos de Trace-Text, o tal vez XML o base de datos.

Esta es información a nivel detallado y menor (por ejemplo, interruptores booleanos personalizados para activar/desactivar volcados de datos sin procesar). Esto proporciona las agallas o los detalles de lo que un sistema está haciendo a nivel de subactividad.

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

Una gran diferencia entre esta información y un archivo de registro de la aplicación es que no está estructurado. Mientras que un Registro de aplicación puede tener campos para A, Desde, Cantidad, etc., Los trazos de depuración detallados pueden ser lo que un programador introduzca, por ejemplo, "comprobación de valores X={valor}, Y = false", o aleatorio comentarios / marcadores como "Hecho, tratando de nuevo".

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

Si está planeando usar un visor de registros en particular porque tiene una correlación compleja, por ejemplo, el Visor de Seguimiento de Servicios, entonces necesita usar un formato apropiado, es decir, XML. De lo contrario, un archivo de texto simple suele ser lo suficientemente bueno at en los niveles inferiores la información está en gran parte desestructurada, por lo que puede encontrar volcados de matrices, volcados de pila, etc. Siempre que pueda correlacionarse con registros más estructurados en niveles más altos, las cosas deberían estar bien.

P: Si usa archivos, ¿usa registros móviles o solo un archivo? ¿Cómo haces que los registros estén disponibles para que la gente los consuma?

A: Para los archivos, generalmente desea archivos de registro rolling desde una capacidad de administración punto de vista (con Sistema.Los diagnósticos simplemente usan VisualBasic.Tala.FileLogTraceListener).

La disponibilidad depende nuevamente del sistema. Si solo está hablando de archivos, entonces para un servidor / servicio, solo se puede acceder a los archivos rolling cuando sea necesario. (El Registro de Eventos de Windows o los Registros de Aplicaciones de Base de datos tendrían sus propios mecanismos de acceso).

Si no tiene acceso fácil al sistema de archivos, entonces el seguimiento de depuración a una base de datos puede ser más fácil. [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 rastreo muy detallada en un "flight recorder" mientras se ejecutaba y luego cuando lo apagaba si no tenía problemas, simplemente eliminaba el archivo.

Si, sin embargo, se bloqueó o encontró un problema, entonces el archivo no se eliminó. Ya sea si detecta el error, o la próxima vez que se ejecute, notará el archivo, y luego puede tomar medidas, por ejemplo, comprimirlo (por ejemplo, 7zip) y envíalo por correo electrónico o ponlo a disposición.

Muchos sistemas hoy en día incorporan informes automatizados de fallas a un servidor central (después de verificar con los usuarios, por ejemplo, por razones de privacidad).


Viendo

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

R: Si tiene varios registros por diferentes razones, utilizará varios visores.

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

Si tiene operaciones complejas, por ejemplo, actividades con transferencias, entonces usted, obviamente, utilizar una herramienta especializada como el Service Trace Viewer. (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, entonces proporciona una forma rápida de obtener una visión general, de una manera estructurada (busque los iconos de error/advertencia bonitos). Solo necesita comenzar a buscar archivos de texto si no hay suficiente en el registro, aunque al menos el registro te da un punto de partida. (En este punto, asegurarse de que sus registros tengan entires coordinados se vuelve útil).

Generalmente el Registro de eventos de Windows también hace que estos eventos significativos estén disponibles para herramientas de monitoreo como MOM o OpenView.

Otros -

Si inicia sesión en una base de datos, puede ser fácil filtrar y ordenar la información (por ejemplo, acercar un id de actividad en particular. (Con los archivos de texto puede utilizar Grep / PowerShell o similar para filtrar en el GUID partiular want)

MS Excel (u otro programa 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 vayan en diferentes columnas.

Cuando se ejecuta un servicio en debug/test, normalmente lo alojo en una aplicación de consola por simplicidad, encuentro útil un registrador de consola de color (por ejemplo, rojo para errores, amarillo para advertencias, etc.). Necesita implementar un oyente de seguimiento personalizado.

Tenga en cuenta que la framework 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 perdido tiempo reinventando la rueda y reimplantando el registro básico, el filtrado y el registro de archivos de texto, el Registro de Eventos de Windows y los archivos XML, cada uno a su manera diferente( las declaraciones de registro son diferentes en cada uno); cada versión de, por ejemplo, un registrador de bases de datos, cuando la mayor parte de eso ya existía y todo lo que se necesitaba era un par de oyentes de rastreo más para el Sistema.Diagnostico. Hablando de un gran desperdicio de esfuerzo duplicado.

Q: Si usted está construyendo un ASP.NET solución, usted también utiliza ASP.NET ¿Monitoreo de Salud? ¿Incluye la salida de seguimiento en los eventos del monitor de estado? ¿Qué hay de Trace?axd?

Estas cosas se pueden activar/desactivar según sea necesario. Encuentro Rastros.axd bastante útil para depurar cómo un el 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 verla completamente equipada con contadores de Monitor de rendimiento y registro en el Registro de eventos de Windows. Estas son las herramientas estándar en Windows y deben usarse.

Debe asegurarse de incluir instaladores para el contadores de rendimiento y registros de eventos que utilice; estos deben crearse en el momento de la instalación (al instalar como administrador). Cuando la aplicación se está ejecutando normalmente no debería tener privilegios de administración (por lo que no podrá crear registros faltantes).

Esta es una buena razón para practicar el desarrollo como no administrador (tener una cuenta de administrador separada para cuando necesite instalar servicios, etc.). Si escribe en el Registro de eventos,. NET creará automáticamente un registro faltante la primera vez que escribes en él; si te desarrollas como un no administrador, te darás cuenta de esto temprano y evitarás una desagradable sorpresa cuando un cliente instale tu sistema y luego no pueda usarlo porque no se está ejecutando como administrador.

 232
Author: Sly Gryphon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-30 13:31:56

Tengo que unirme al coro recomendando log4net, en mi caso viniendo desde un punto de vista de flexibilidad de plataforma (desktop.Net/Compact Framework, 32/64-bit).

Sin embargo, envolverlo en una API de etiqueta privada es un anti-patrón mayor . log4net.ILogger ya es la contraparte. net de Commons Logging wrapper API , por lo que el acoplamiento ya está minimizado para usted, y como también es una biblioteca de Apache, eso generalmente ni siquiera es una preocupación porque no está renunciando a ninguna control: bifurcarlo si es necesario.

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

  1. Usando un logger único global (o equivalentemente un punto de entrada estático) que pierde la resolución fina del patrón recomendado logger-por-clase para ninguna otra ganancia de selectividad.
  2. No exponer el argumento opcional Exception , lo que lleva a múltiples problemas:
    • Hace una política de registro de excepciones aún más difícil de mantener, por lo que no se hace nada consistente con excepciones.
    • Incluso con una política consistente, formatear la excepción en una cadena pierde datos prematuramente. He escrito un decorador personalizado ILayout que realiza un desglose detallado de una excepción para determinar la cadena de eventos.
  3. No exponer las propiedades IsLevelEnabled , lo que descarta la capacidad de omitir el código de formato cuando se cambian áreas o niveles de registro fuera.
 41
Author: Jeffrey Hantin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-23 04:54:33

No me desarrollo a menudo en asp.net Sin embargo, cuando se trata de madereros, creo que muchas de las mejores prácticas son universales. Estos son algunos de mis pensamientos aleatorios sobre el registro que he aprendido a lo largo de los años:

Marcos

  • Use un framework de abstracción de logger, como slf4j (o roll your own), para desacoplar la implementación del logger de su API. He visto una serie de marcos de registro ir y venir y es mejor ser capaz de adoptar uno nuevo sin mucho molestia.
  • Trate de encontrar un framework que soporte una variedad de formatos de salida.
  • Intenta encontrar un framework que soporte plugins / filtros personalizados.
  • Utilice un marco que puede ser configurado por archivos externos, de modo que sus clientes / consumidores pueden ajustar la salida de registro fácilmente para que pueda ser leído por las aplicaciones de gestión de registros comerciales con facilidad.
  • Asegúrese de no exagerar en los niveles de registro personalizados, de lo contrario es posible que no pueda moverse a diferentes registros marco.

Salida del registrador

  • Trate de evitar los registros de estilo XML/RSS para el registro que podría encontrar fallas catastróficas. Esto es importante porque si el interruptor de encendido se apaga sin que su registrador escriba la etiqueta de cierre </xxx>, su registro se rompe.
  • Hilos de registro. De lo contrario, puede ser muy difícil rastrear el flujo de su programa.
  • Si tiene que internacionalizar sus registros, es posible que desee que un desarrollador solo inicie sesión en inglés (o en su idioma de opción).
  • A veces tener la opción de insertar instrucciones de registro en consultas SQL puede ser un salvavidas en situaciones de depuración. Tales como:
    -- Invoking Class: com.foocorp.foopackage.FooClass:9021
    SELECT * FROM foo;
  • Desea un registro a nivel de clase. Normalmente no quieren estática instancias de registradores así - no vale la pena el micro-optimización.
  • Marcar y categorizar las 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 sobre estados críticos.
  • Los filtros de duplicación guardarán su vista y su disco duro. ¿Realmente quieres ver la misma declaración de registro repetida 10^10000000 veces? ¿No sería mejor sólo para conseguir un mensaje como: This is my logging statement - Repeated 100 times

Véase también esta cuestión mía.

 19
Author: Elijah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:59

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

Comenzamos con un logger Singleton que era utilizado por cada hilo dentro de la JVM, y establecemos el nivel de registro para todo el proceso. Esto resultó en registros enormes si teníamos que depurar incluso una parte muy específica del sistema, por lo que la lección número uno es segmentar su registro.

Nuestro la encarnación actual del registrador permite múltiples instancias con una definida como predeterminada. Podemos crear instancias de cualquier número de registradores secundarios que tengan diferentes niveles de registro, pero la faceta más útil de esta arquitectura es la capacidad de crear registradores para paquetes y clases individuales 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 usando Apache commons-logging biblioteca envuelta alrededor de Log4J.

Espero que esto ayude!

* Editar *

Después de leer el post de Jeffrey Hantin a continuación, me di cuenta de que debería haber notado lo que nuestro contenedor de registro interno se ha convertido en realidad. Ahora es esencialmente una fábrica y se utiliza estrictamente para obtener un registrador de trabajo 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, I sospecho que se volverá aún más delgado y si está comenzando una nueva aplicación, definitivamente estaría de acuerdo con su declaración de que ni siquiera debería molestarse en envolver el registrador.

 17
Author: Steve Moyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 00:20:34

Utilizamos Log4Net en el trabajo como el proveedor de registro, con un contenedor singleton 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 simple / reconfiguración en varios entornos
  • Buen número de appenders prediseñados
  • Uno de los CMS que usamos ya lo tenía incorporado
  • Buen número de niveles de registro y configuraciones alrededor [10]]}

Debo mencionar, esto es hablar desde un ASP.NET punto de vista del desarrollo

Puedo ver algunos méritos en el uso de la Traza que está en el.NET framework, pero no estoy completamente convencido de ello, principalmente porque los componentes con los que trabajo realmente no hacen ninguna llamada de Traza. La única cosa que uso con frecuencia que hace es System.Net.Mail de lo que puedo decir.

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

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 comprobación para ver si el nivel de registro está habilitado, por lo que no tiene llamadas redundantes a la API de log4net (por lo que si Debug no está habilitado, las declaraciones de depuración se ignoran), pero cuando tenga algún tiempo lo actualizaré para exponerlas para que pueda hacer las comprobaciones usted mismo. Esto evitará que se realicen evaluaciones 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);

(Ahorra un poco de tiempo de ejecución)

Por defecto nosotros registro 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 & Fatal

Los archivos se realizan como rolling de cada día o 10mb (IIRC). No utilizamos el EventLog, ya que puede requerir una mayor seguridad de la que a menudo queremos dar a un sitio.

Encuentro que el bloc de notas funciona bien para leer registros.

 9
Author: Aaron Powell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-23 01:59:33

¿Qué frameworks utilizas?

Usamos una mezcla del bloque de aplicación de registro y un ayudante de registro personalizado que funciona alrededor de los bits de.Net framework. El LABORATORIO está configurado para generar archivos de registro bastante extensos, incluidos archivos de seguimiento 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 de excepción completa y pila (en el caso de un excepción inesperada).

El ayudante de registro personalizado hace uso de la Traza.Correlación y es particularmente útil en el contexto de registro en WF. Por ejemplo, tenemos una máquina de estados 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 detenemos la operación lógica con un controlador de eventos de retorno gerérico.

Esto ha demostrado ser útil algunas veces al intentar depurar fallos en complejos secuencias de negocio, ya que nos permite determinar cosas como If / Else Branch decisions, etc. más rápidamente en función de la secuencia de ejecución de la actividad.

¿Qué salidas de registro utiliza?

Utilizamos archivos de texto y archivos 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 excepciones genéricas de tipo de negocio. Los archivos de texto son registros móviles que son rodado por día y tamaño (creo que el tamaño total de 1MB es un punto de vuelco).

¿Qué herramientas utiliza para ver los registros?

Estamos usando Bloc de notas y WCF Service Trace Viewer dependiendo del grupo de salida que estemos viendo. El WCF Service Trace Viewer es realmente muy ú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é aproximadamente dónde está el error de todos modos, simplemente leer un archivo de texto bien anotado es bueno como bien.

Los registros se envían a un solo directorio que luego se divide en sub-dirs basados en el servicio de origen. El directorio raíz se expone a través de un sitio web que tiene su acceso controlado por un grupo de usuarios de soporte. Esto nos permite echar un vistazo a los registros de producción sin tener que realizar solicitudes y pasar por largos procesos burocráticos para los datos de producción.

 8
Author: Steve Godbold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-23 04:22:52

Como autores de la herramienta, por supuesto usamos SmartInspect para registrar y rastrear aplicaciones.NET. Por lo general, usamos el protocolo de tubería con nombre para el registro en vivo y los archivos de registro binarios (cifrados) para los registros del usuario final. Utilizamos la consola SmartInspect como herramienta de visualización y supervisión.

En realidad hay bastantes marcos de registro y herramientas para.NET por ahí. Hay una visión general y comparación de las diferentes herramientas en DotNetLogging.com .

 6
Author: Dennis G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-23 09:44:38

Hay muchas recomendaciones excelentes en las respuestas.

Una buena práctica general es considerar quién va a leer el registro. En mi caso será un administrador en el sitio del cliente. Así que registro mensajes que les dan algo sobre lo que pueden actuar. Por ejemplo, " No se puede inicializar la aplicación. Esto generalmente es causado por ......"

 5
Author: Matthew Sposato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 13:13:06

Utilizamos log4net en nuestras aplicaciones web.

Su capacidad para personalizar el registro en tiempo de ejecución cambiando el archivo de configuración XML es muy útil cuando una aplicación no funciona correctamente en tiempo de ejecución y necesita ver más información.

También le permite dirigirse a clases o atributos específicos para iniciar sesión. Esto es muy útil cuando se tiene una idea de dónde se está produciendo el error. Un ejemplo clásico es NHibernate donde desea ver sólo el SQL va a la base.

Editar:

Escribimos todos los eventos en una base de datos y en el sistema de Seguimiento. El registro de eventos que utilizamos 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.

 1
Author: Jeffrey Cameron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-23 14:09:09

En lo que respecta al registro orientado a aspectos, me recomendaron PostSharp en otra pregunta TAN:

Registro orientado a aspectos con Unity\T4 \ anything else

Vale la pena visitar el enlace proporcionado en la respuesta si está evaluando marcos de registro.

 1
Author: Unmesh Kondolikar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:19