323 votos

Registro de mejores prácticas

Me gustaría conseguir historias sobre cómo las personas manejan el seguimiento y el registro en las aplicaciones reales. Aquí hay algunas preguntas que pueden ayudar a explicar su respuesta.

Marcos

Lo que marcos usa usted?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • Aplicación de registro de bloque
  • Otros?

Si usted utiliza el seguimiento, hacer uso de Trace.Correlation.StartLogicalOperation?

Escribe este código de forma manual, o hacer uso de alguna forma de programación orientada a aspectos para hacerlo? Cuidado para compartir un fragmento de código?

¿Ofrecen alguna forma de granularidad más de rastrear las fuentes? Por ej., WPF TraceSources permiten configurar en varios niveles:

  • System.Windows - configuración de todos WPF
  • System.Windows.Animation - reemplazar específicamente para la Animación.

Los oyentes

¿Qué registro de salidas se utilizan?

  • Archivos de texto
  • Archivos XML
  • Registro de eventos
  • Otros?

Si el uso de los archivos, haga usted uso de rodadura registros o simplemente un solo archivo? ¿Cómo hacer que los registros disponibles para que la gente los consuma?

Ver

¿Qué herramientas a utilizar para la visualización de los registros?

  • El bloc de notas
  • Cola
  • Visor de sucesos
  • Centro De Sistemas De Operaciones/Gerente De Operaciones De Microsoft Pesebre
  • Servicio WCF Visor de Seguimiento
  • Otros?

Si usted está construyendo un ASP.NET solución, hacer también uso ASP.NET Vigilancia de la Salud? ¿Incluye la salida de la traza en la salud de monitor de eventos? ¿Qué acerca de Trace.axd?

¿Qué acerca de los contadores de rendimiento personalizados?

232voto

Sly Puntos 2992
>

41voto

Jeffrey Hantin Puntos 19272

Tengo que unirme al coro de recomendar log4net, en mi caso, viniendo de una plataforma de flexibilidad (de escritorio .Net/Compact Marco, 32/64-bit) punto de vista.

Sin embargo, envolviéndola en una etiqueta privada API es una de los principales anti-patrón. log4net.ILogger es el .Net contrapartida de los Commons Logging contenedor de la API ya, por lo que el acoplamiento ya está minimizado para usted, y ya que también es un Apache de la biblioteca, que normalmente no es aún motivo de preocupación ya que no están dando ningún tipo de control: horquilla si debe.

La mayoría de los de la casa de contenedor de bibliotecas he visto también a cometer uno o más de una letanía de fallos:

  1. El uso de un mundial singleton registrador (o, equivalentemente, una entrada estática punto), que pierde la buena resolución de la recomendada registrador-per-patrón de clase para ningún otro selectividad de ganancia.
  2. No exponga el facultativo Exception argumento, lo que conduce a múltiples problemas:
    • Se hace un registro de la excepción de la política aún más difícil de mantener, por lo que no se hace nada de forma consistente con las excepciones.
    • Incluso con una política coherente, el formato de la excepción de distancia en una cadena pierde datos de forma prematura. He escrito una costumbre ILayout decorador, que realiza detallada drill-down de una excepción para determinar la cadena de acontecimientos.
  3. No exponga la Is propiedades, lo que descarta la posibilidad de saltarse el código de formato cuando las áreas o niveles de registro están apagados.

19voto

Elijah Puntos 6464

Yo no se desarrollan con frecuencia en asp.net sin embargo, cuando se trata de registradores creo que muchas de las mejores prácticas son universales. Aquí están algunos de mis pensamientos al azar en el registro que he aprendido a lo largo de los años:

Marcos

  • El uso de un registrador de la abstracción marco - como slf4j (o rodar tu propia), por lo que separar el registrador de la implementación de su API. He visto un número de registrador de marcos vienen y van y lo mejor de poder adoptar uno nuevo sin problemas.
  • Trate de encontrar un marco que soporta una variedad de formatos de salida.
  • Trate de encontrar un marco que soporta plugins / filtros personalizados.
  • El uso de un marco que puede ser configurado por los archivos externos, de modo que sus clientes / consumidores puede ajustar el registro de salida fácilmente, por lo que puede ser leído por el comercial de registro de la gestión de las aplicaciones con facilidad.
  • Asegúrese de no ir por la borda a la medida de los niveles de registro, de lo contrario puede no ser capaz de moverse a diferentes marcos de registro.

Registrador De Salida

  • Trate de evitar XML/RSS de estilo registros para el registro, que se podrían encontrar fallas catastróficas. Esto es importante porque si el interruptor de encendido se apague sin tu registrador de la escritura el cierre </xxx> tag, your log is broken.
  • Registro de hilos. De lo contrario, puede ser muy difícil para seguir el flujo del programa.
  • Si usted tiene que internacionalizar sus registros, puede que desee tener un desarrollador de registro sólo en inglés (o el idioma que prefieras).
  • A veces, tener la opción de insertar el registro de declaraciones en las consultas SQL pueden ser un salvavidas en la depuración de las situaciones. Tales como:
 -- Invocando Clase: com.foocorp.foopackage.FooClass:9021
 SELECT * FROM foo;
  • Desea clase de nivel de registro. Normalmente no quieren estática instancias de registradores así - no vale la pena el micro-optimización.
  • Marcado y clasificación de excepciones registradas a veces es útil porque no todas las excepciones son creados iguales. Así que sabiendo un subconjunto de importantes excepciones a un jefe de tiempo es útil, si usted tiene un registro de monitor que necesita para enviar notificaciones a los estados decisivos.
  • La duplicación de los filtros salvar a su vista y del disco duro. ¿Realmente quieres ver el mismo registro de instrucción se repiten de 10^10000000 de veces? ¿No sería mejor obtener un mensaje similar a: This is my logging statement - Repeated 100 times

También ver a esta pregunta de la mina.

17voto

Steve Moyer Puntos 4312

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

Empezamos con un Singleton registrador que fue utilizado por cada hilo dentro de la JVM, y establecer el nivel de registro para el proceso completo. Esto se tradujo en enormes troncos si hemos tenido que depurar incluso una muy específica de parte del sistema, así que la lección número uno es el segmento de su registro.

Nuestra encarnación actual del registrador permite múltiples instancias con que se define como el valor predeterminado. Podemos crear una instancia de cualquier número de niños registradores que tienen diferentes niveles de registro, pero la más útil de las facetas de esta arquitectura es la capacidad de crear los registradores de paquetes individuales y clases, simplemente cambiando las propiedades de registro. Lección número dos es la creación de un sistema flexible que permite primordial de su comportamiento, sin cambiar el código.

Estamos usando el Apache commons-logging biblioteca envuelto alrededor de Log4J.

Espero que esto ayude!

* Edit *

Después de leer Jeffrey Hantin del post de abajo, me di cuenta de que me han señalado lo que nuestros registros internos de contenedor se ha convertido en realidad. Ahora es esencialmente una fábrica y está estrictamente utilizado para obtener un trabajo de registrador de la correcta utilización de la propiedades de archivo (que por motivos de compatibilidad, no ha sido movido a la posición predeterminada). Ya que se puede especificar la configuración de registro de archivo en línea de comandos ahora, sospecho que será aún más delgado y si usted está comenzando una nueva aplicación, yo estaría totalmente de acuerdo con su declaración de que usted no debería molestarse en envolver el registrador.

9voto

Aaron Powell Puntos 15598

Utilizamos Log4Net en el trabajo, como el de registro de proveedor, con un singleton contenedor para la instancia de registro (aunque el singleton se encuentra en revisión, cuestionamiento de si son una buena idea o no).

Lo hemos elegido por los siguientes motivos:

  • Sencilla configuración y reconfiguración en diversos ambientes.
  • Buen número de pre-construido appenders
  • Uno de los CMS de la utilizamos ya que había construido en
  • Buen número de niveles de registro y configuraciones de todo ellos

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

Puedo ver algunos méritos en el uso de la Traza que se encuentra en el .NET marco, pero no estoy totalmente vendido en él, principalmente porque los componentes que trabajo realmente no hacen ningún Rastro de las llamadas. La única cosa que frecuentemente uso que hace es System.Net.Mail de lo que puedo contar.

Así que tenemos una biblioteca que envuelve log4net y dentro de nuestro código sólo 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 que hacer una comprobación para ver si el nivel de registro está habilitado, por lo que no tiene redundante llamadas a la log4net API (así, si la Depuración no está habilitada la depuración se omiten las instrucciones), pero cuando tengo algo de tiempo voy a estar actualizando para exponer, así que usted puede hacer los controles a ti mismo. Esto evitará que las evaluaciones realizadas cuando no debe, 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);

(Guardar un poco de execusion tiempo)

Por defecto se registra en dos lugares:

  1. Sistema de archivos de la web (en un no-sirve la extensión de archivo)
  2. Envío de correo electrónico por Error Y Fatal

Archivos como el balanceo de cada día o 10 mb (IIRC). No utilizamos el registro de Sucesos, ya que puede requerir una mayor seguridad que con frecuencia se desea dar a un sitio.

Me parece Bloc de notas funciona bien para la lectura de los registros.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: