2008-10-16 10 views
19

Tengo una aplicación multiusuario que mantiene un archivo de registro centralizado para la actividad. En este momento, ese registro va a archivos de texto por una suma de alrededor de 10MB-50MB/día. Los archivos de texto son rotados diariamente por el registrador, y mantenemos el valor de los últimos 4 o 5 días. Más viejo que eso no nos interesa.Uso de un servidor SQL para el registro de aplicaciones. ¿Pros contras?

Se leen raramente: al desarrollar la aplicación para mensajes de error, mensajes de diagnóstico o cuando la aplicación está en producción para realizar un triage en un problema o un error informados por el usuario.

(Esto es estrictamente un registro de aplicación. Registro de seguridad se mantiene en otro sitio.)

Pero cuando se leen, son un dolor en el culo. La ampliación de archivos de texto de 10 MB no es divertida, incluso con Perl: los campos (ID de transacción, ID de usuario, etc.) en el archivo son útiles, pero solo texto. Los mensajes se escriben de forma secuencial, uno a la vez, por lo que la actividad intercalada se mezcla al intentar seguir una transacción o usuario en particular.

Estoy buscando ideas sobre el tema. ¿Alguien hizo un registro a nivel de aplicación con una base de datos SQL y le gustó? ¿Lo odié?

+0

Realmente quiere decir cualquier RDBMS. ¿No? Quiero decir que o bien inicias sesión en los archivos o te registras en una base de datos, ¿verdad? –

Respuesta

13

Sí, lo hacemos aquí, y no puedo soportarlo. Un problema que tenemos aquí es si hay un problema con el DB (conexión, etc. corrupto), se detiene todo el registro. Mi otro gran problema es que es difícil de seguir para rastrear problemas. También tenemos problemas aquí con los registros de tabla ocupando demasiado espacio y teniendo que preocuparse por truncarlos cuando movemos bases de datos porque nuestros registros son muy grandes.

Creo que es torpe en comparación con los archivos de registro. Me resulta difícil ver el "panorama general" con el que se almacena en la base de datos. Admitiré que soy una persona de archivo de registro, me gusta poder abrir un archivo de texto y revisar (regex) en lugar de usar sql para intentar buscar algo.

El último lugar donde trabajé teníamos archivos de registro de 100 meg más. Son un poco difíciles de abrir, pero si tienes la herramienta adecuada no es tan malo. Tuvimos un sistema para registrar mensajes también. Puede mirar rápidamente el archivo y determinar qué conjunto de entradas de registro pertenecía a cada proceso.

17

Utilizamos una base de datos de registro en mi último trabajo, y fue genial.

Teníamos procedimientos almacenados que escindían visiones generales del estado general del sistema para diferentes métricas que podía cargar desde una página web. También podríamos escupir rápidamente un rastro para una aplicación determinada durante un período determinado, y si lo quería era fácil obtenerlo como un archivo de texto, si realmente le gusta grep-ing archivos.

Para garantizar que el sistema de registro no se convierta en un problema, existe un marco de código común que usamos entre las diferentes aplicaciones que manejaban la escritura en la tabla de registro. Parte de ese marco incluía también registrando en un archivo, en caso de que el problema sea con la base de datos en sí, y parte de ello implica el ciclo de los registros. En cuanto a los problemas de espacio, la base de datos de registro está en un calendario de copia de seguridad diferente, y realmente no es un problema. El espacio (sin copia de seguridad) es barato.

Creo que resuelve la mayoría de las preocupaciones expresadas en otros lugares. Todo es una cuestión de implementación. Pero si me detuviera aquí, todavía sería un caso de "no mucho peor", y esa es una mala razón para tomarse la molestia de configurar el registro de DB. Lo que me gustó de esto es que nos permitió hacer algunas nuevas cosas que serían mucho más difíciles de hacer con los archivos planos.

Hubo cuatro mejoras principales sobre los archivos. La primera son las descripciones generales del sistema que ya he mencionado. El segundo, y lo más importante, era un control para ver si a alguna aplicación le faltaban mensajes en los que normalmente esperaríamos encontrarlos. Ese tipo de cosas es casi imposible de detectar en el registro tradicional de archivos, a menos que pases mucho tiempo revisando diarios que te den a entender en las aplicaciones que te dicen que todo está bien el 99% del tiempo. Es sorprendente cómo es la liberación de la vista para mostrar las entradas de registro faltantes. La mayoría de los días no necesitábamos ver la mayoría de los archivos de registro en absoluto ... algo que sería peligroso e irresponsable sin la base de datos.

Eso trae a colación la tercera mejora. Generamos un solo correo electrónico de estado diario, y fue el único que necesitábamos revisar los días en que todo funcionaba normalmente. El correo electrónico incluido mostró errores y advertencias. Los registros perdidos se volvieron a registrar como advertencia por el mismo trabajo de DB que envía el correo electrónico, y la falta de correo electrónico fue un gran problema. Podríamos enviar un mensaje de registro en particular a nuestro rastreador de errores con un solo clic, directamente desde el correo electrónico diario (tenía formato html, datos extraídos de una aplicación web).

La mejora final fue que si queríamos seguir más de cerca una aplicación específica, por ejemplo, después de hacer un cambio, podríamos suscribirnos a una fuente RSS para esa aplicación específica hasta que estuviéramos satisfechos. Es más difícil hacer eso desde un archivo de texto.

Donde estoy ahora, confiamos mucho más en herramientas de terceros y sus habilidades de registro, y eso significa volver a revisar mucho más manualmente. Extraño mucho el DB, y estoy contemplando escribir una herramienta para leer esos registros y volver a registrarlos en un DB para recuperar estas habilidades.

De nuevo, lo hicimos con los archivos de texto como una alternativa, y son las nuevas habilidades las que realmente hacen que la base de datos valga la pena. Si todo lo que vas a hacer es escribir en un DB e intentar usarlo de la misma forma que lo hiciste con los archivos de texto antiguos, agrega complejidad innecesaria y también puedes usar los archivos de texto antiguos. Es la capacidad de construir el sistema para las nuevas características que hace que valga la pena.

+0

¿Cómo está haciendo el registro en la base de datos, quiero implementar un mecanismo similar de registro y quería ver cuál es la mejor forma o estándar de iniciar sesión en la base de datos? Cualquier guía de arquitectura sería muy apreciada. – Rachel

+1

@ Rachel Todo lo que hice fue implementar un [TraceListener] (http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx) que escribía mensajes en la base de datos. Entonces todo el registro fue solo llamadas [System.Diagnostics.Trace] (http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.aspx): easy peasy. Parte del marco común en nuestras aplicaciones fue el código para cargar nuestro tracelistener personalizado y un TextWriterTraceListener para el archivo de registro adecuado. –

+0

Gracias por las entradas, pero ¿conoces una forma similar de hacerlo en Java? – Rachel

3

Creo que el problema que tiene con el registro podría resolverse con el registro en SQL, proporcionado que puede dividir los campos que le interesan, en columnas diferentes. No puede tratar la base de datos SQL como un campo de texto y esperar que sea mejor, no lo hará.

Una vez que obtiene todo lo que le interesa para iniciar sesión en las columnas que desea, es mucho más fácil rastrear las acciones secuenciales de algo al poder aislarlo por columna. Como si tuvieras un proceso de "entrada", registras todo normalmente y el texto "proceso de entrada" se coloca en la columna "logtype" o en la columna "process". Luego, cuando tiene problemas con el "proceso de entrada", una declaración WHERE en esa columna aísla todos los procesos de entrada.

0

pude ver que funcione bien, siempre y cuando haya la posibilidad de filtrar el lo necesidades que vayan a registrarse y cuando se tiene que estar conectado. Un archivo de registro (o una tabla, tal como está) es inútil si no puede encontrar lo que está buscando o si contiene información innecesaria.

3

Hemos utilizado el registro centralizado del Servidor SQL anteriormente, y como se mencionó anteriormente, el mayor problema fue que la interrupción de la conectividad a la base de datos significaría la interrupción del registro. De hecho, terminé agregando una rutina de cola al registro que probaría primero la base de datos y escribiría en un archivo físico si fallara. Simplemente tendría que agregar código a esa rutina que, en un registro exitoso de la base de datos, verificará si hay otras entradas en cola localmente y las escribirá también.

Me gusta tener todo en una base de datos, a diferencia de los archivos de registro físicos, pero solo porque me gusta analizar los informes que he escrito.

+0

¿Cómo lo ha implementado, cuál es la arquitectura detrás de él? – Rachel

+0

@ Rachel: Fue bastante sencillo: tenía un proceso de registro en dos pasos, donde intentaba iniciar sesión en la base de datos remota primero, escribiendo en un archivo XML si eso fallaba, y luego el segundo paso era que verificaría el archivo XML local para cualquier entrada y enviarlas a la base de datos (suponiendo que la llamada inicial haya tenido éxito). De esa forma, el bloque Catch para el intento de registro de la base de datos se encargó de guardarlo localmente, y luego de una llamada a la base de datos exitosa, siempre se verificaba para ver si había algo más que hacer. Desde que escribí en el registro de un hilo de fondo, nunca levanté la aplicación. – SqlRyan

+0

Si es posible, me gustaría ver algún código o pseudocódigo para entender cómo se hace esto, ya que tengo un requisito similar, estaba pensando en crear una entidad y almacenarla en la tabla de la base de datos y usar hibernación para la interacción y luego tener una función que tomar en cadena y guardar esa cadena en la entidad y guardar en la tabla y llamar a esta función desde otra función y pasar la información de registro, no estoy 100% seguro de si esta es una buena manera de hacerlo o incluso si es factible y por eso quería aprender sobre su enfoque – Rachel

2

lo hacemos en nuestra organización en grandes volúmenes con SQL Server. En mi apertura, escribir en la base de datos es mejor debido a la capacidad de búsqueda y filtro. Rendimiento de 10 a 50 MB de datos y mantenerlo solo durante 5 días, no afecta su aplicación. La transacción de seguimiento y los usuarios serán muy fáciles de comparar con el seguimiento desde un archivo de texto, ya que puede filtrar por transacción o por usuario.

Menciona que los archivos son raros. Entonces, decida si vale la pena invertir tiempo en el desarrollo para desarrollar el marco de registro. Calcule su tiempo dedicado a buscar los registros de los archivos de registro en un año frente al tiempo que le llevará codificar y probar. Si el gasto de tiempo es de 1 hora o más por día para los registros de búsqueda, es mejor descargar los registros en la base de datos. Lo cual puede reducir drásticamente el tiempo invertido en resolver problemas.

Si pasas menos de una hora puedes utilizar algunas herramientas de búsqueda de texto como "SRSearch", que es una gran herramienta que utilicé, busca desde múltiples archivos en una carpeta y te da los resultados en pequeños snippts (" como resultado de búsqueda de google "), donde hace clic para abrir el archivo con el resultado interesado. También hay otras herramientas de búsqueda de texto disponibles. Si el entorno es Windows, también tiene Microsoft LogParser, una buena herramienta disponible gratis donde puede consultar su archivo como una base de datos si el archivo está escrito en un formato específico.

22

Creo que el registro directamente en una base de datos suele ser una mala idea, y lo evitaría.

La razón principal es esta: un buen registro será más útil cuando puede usarlo para depurar su aplicación post-mortem, una vez que el error ya ha ocurrido y no puede reproducirlo. Para poder hacer eso, debe asegurarse de que el registro sea confiable. Y para que cualquier sistema sea confiable, un buen comienzo es mantenerlo simple.

Tener un registro simple basado en archivos con solo unas pocas líneas de código (abrir archivo, agregar línea, cerrar archivo o mantenerlo abierto, repetir ...) generalmente será más confiable y útil en el futuro, cuando realmente necesitas que funcione

Por otro lado, iniciar sesión correctamente en un servidor SQL requerirá que muchos más componentes funcionen correctamente, y habrá muchas más situaciones de error posibles en las que no podrá registrar la información que necesita, simplemente porque la infraestructura de registro en sí no funcionará. Y algo peor: una falla en el procedimiento de registro (como una corrupción de base de datos o un punto muerto) probablemente afectará el rendimiento de la aplicación, y entonces tendrá una situación donde un componente secundario impide que la aplicación realice su función principal.

Si necesita hacer un gran análisis de los registros y no se siente cómodo utilizando herramientas basadas en texto como grep, guarde los registros en archivos de texto e impórtelos periódicamente en una base de datos SQL. Si el SQL falla, no perderá ninguna información de registro, y ni siquiera afectará la capacidad de la aplicación para funcionar. Luego puede hacer todo el análisis de datos en la base de datos.

Creo que esas son las razones principales por las que no hago el registro en una base de datos, aunque lo he hecho en el pasado. Espero eso ayude.

1

Puede iniciar sesión en un formato de texto delimitado por comas o tabulaciones, o permitir que sus registros se exporten a un formato CSV. Cuando necesite leer de un registro, exporte su archivo CSV a una tabla en su servidor SQL, entonces puede consultar con sentencias SQL estándar. Para automatizar el proceso, puede usar SQL Integration Services.

0

Como sus registros se leen raramente, los escribiría en el archivo (mejor rendimiento y confiabilidad).

Luego, si y solo si necesita leerlos, importaría el archivo de registro en una base de datos (mejor análisis).

Al hacerlo, obtiene las ventajas de ambos métodos.

1

Aquí están algunas ventajas y desventajas adicionales y la razón por la que prefiero los archivos de registro en lugar de bases de datos:

  1. El espacio no es tan barato cuando se utiliza de VPS. Recuperar espacio en sistemas de bases de datos en vivo es a menudo una gran molestia y es posible que tenga que cerrar servicios mientras recupera espacio. Si sus registros son tan importantes que debe guardarlos durante años (como nosotros), entonces este es un problema real. Recuerde que la mayoría de las bases de datos no recuperan espacio cuando elimina datos, ya que simplemente reutilizan el espacio, lo cual no es de mucha ayuda si se está quedando sin espacio.

  2. Si accede a los registros con mayor frecuencia y tiene que extraer informes diarios de una base de datos con una enorme tabla de registro y millones y millones de registros, tendrá impacto en el rendimiento de sus servicios de base de datos mientras consulta los datos de la base de datos.

  3. Los archivos de registro se pueden crear y los registros más antiguos se archivan a diario. Según el tipo de registros, se pueden recuperar grandes cantidades de espacio archivando registros. Ahorramos alrededor de 6 veces el espacio cuando comprimimos nuestros registros y, en la mayoría de los casos, probablemente ahorremos mucho más.

  4. Pequeños archivos de registro individuales se pueden comprimir y transferir fácilmente sin afectar el servidor. Anteriormente teníamos registros que abarcaban los 100 de GB de datos en una base de datos. Mover estas grandes bases de datos entre servidores se convierte en una gran molestia, especialmente debido al hecho de que debe cerrar el servidor de la base de datos mientras lo hace. Lo que estoy diciendo es que el mantenimiento se convierte en un verdadero dolor el día que tienes que comenzar a mover grandes bases de datos.

  5. Escribir en archivos de registro en general es mucho más rápido que escribir en DB. No subestime la velocidad de su archivo de sistema operativo IO.

  6. Los archivos de registro solo apestan si no se estructuran los registros correctamente. Puede que tenga que usar herramientas adicionales e incluso puede tener que desarrollar las suyas propias para ayudar a procesarlas, pero al final valdrá la pena.

1

He estado leyendo todas las respuestas y son geniales. Pero en una empresa que trabajé debido a varias restricciones y auditorías, era obligatorio iniciar sesión en una base de datos. De todos modos, teníamos varias formas de iniciar sesión y la solución era instalar una tubería donde nuestros programadores pudieran conectarse a la tubería e iniciar sesión en la base de datos, archivo, consola o incluso reenviar el registro a un puerto para ser consumido por otras aplicaciones. Esta interconexión no interrumpe el proceso normal y mantener un archivo de registro al mismo tiempo que inicia sesión en la base de datos garantiza que rara vez pierda una línea. Sugiero que investigue más log4net que es genial para esto.

http://logging.apache.org/log4net/

Cuestiones relacionadas