2009-06-28 15 views
10

He estado trabajando en un servidor y estoy empezando a implementar el registro. Sin embargo, no estoy seguro de si debería usar el archivo db para el registro, o simplemente un archivo de texto plano.Registro de servidor en la base de datos o archivo de registro?

Estoy planeando registrar algo de información básica para cada solicitud (qué tipo de solicitud, dirección IP de solicitud, seguimiento de sesión). Para algunas solicitudes, habrá información extendida presente (detalles sobre qué tipo de solicitud se realizó), y si hay algún error, también las registraré.

Por un lado, poner los registros en el db significa que podría ejecutar consultas sobre los datos registrados. Por otro lado, no estoy seguro de si esto pondría una tensión innecesaria en el DB. Por supuesto, también podría usar tanto el db como un archivo de registro para el registro. ¿Cuáles son los pensamientos de las personas sobre la correcta tala?

(Si se hace una diferencia, estoy usando mod_python en un servidor Apache con una base de datos MySQL. Así que me gustaría ya sea a usar la biblioteca logging o simplemente la creación de algunas tablas de registro en la base de datos.)

+1

Puedes ir a un punto intermedio con SQLite: "diseñado para reemplazar fopen()", como dicen los desarrolladores. –

Respuesta

10

Primero, utilice una biblioteca de registro como SLF4J/Logback que le permita tomar esta decisión de forma dinámica. Luego puede ajustar un archivo de configuración y enrutar algunos o todos sus mensajes de registro a cada uno de varios destinos diferentes.

Tenga mucho cuidado antes de iniciar sesión en la base de datos de su aplicación, puede abrumarlo fácilmente si está registrando muchas cosas y el volumen comienza a aumentar. Y si su aplicación se está ejecutando cerca de su capacidad máxima o en un modo de falla, los mensajes de registro pueden ser inaccesibles y estará volando a ciegas. Probablemente los únicos mensajes que deberían ir a la base de datos de su aplicación son los eventos orientados a aplicaciones de alto nivel (un tipo de datos de aplicación).

Es mucho mejor "iniciar sesión en el sistema de archivos" (que para un entorno de producción grande incluye el inicio de sesión en una dirección de multidifusión leída por servidores redundantes de agregación de registros).

Los archivos de registro se pueden leer en bases de datos de análisis especiales donde podría usar, por ejemplo, Hadoop para hacer mapas/reducir análisis de datos de registro.

+1

Inicie sesión en un servidor syslog como splunk, es compatible con muchos formatos de registro y puede hacer que la base de datos se conecte allí, así como el servidor http, y luego puede hacer una referencia cruzada desde una buena interfaz gráfica de usuario utilizable. Asegúrese de estar utilizando el registro asincrónico (log4j y apuesto a que muchos otros tienen ese tipo de complemento). – feniix

+1

SLF4J/Logback son soluciones basadas en Java. Python, un extenso módulo de registro incorporado. –

+0

@John: Es maravilloso, el registro de Java está bastante fragmentado entre tres contendientes principales (java.util.logging, Log4J, Jakarta Commons Logging). SLF4J es un intento de integrar todos estos de manera coherente. El equipo de Python fue muy sabio para hacer esto. –

1

Siempre hemos registrado datos en una base de datos separada de.

Esto nos permite realizar consultas sin afectar la base de datos de la aplicación. También simplifica las cosas si nos damos cuenta de que tenemos que deshabilitar el registro o cambiar la cantidad de lo que registramos.

Pero la mayoría de las bibliotecas de registro modernas admiten incrustar el registro en su aplicación y elegir el destino por configuración: archivo, base de datos, lo que sea.

Logger le brinda muchas maneras de administrar su registro, y aunque el paquete predeterminado no tiene un registrador de base de datos, no sería difícil escribir dicho controlador de eventos.

2

Mix file.log + db sería el mejor. Inicie sesión en la información de base de datos que posiblemente necesite analizar, por ejemplo, la cantidad promedio de usuarios por día, etc. Y use file.log para almacenar cierta información de depuración.

1

Si elige un formato de archivo de registro que pueda analizarse, puede iniciar sesión en un archivo y luego tener un proceso externo (quizás ejecutado por cron) que procese los archivos de registro e inserte los detalles en su base de datos. Esto se puede organizar para que ocurra en un momento en que la carga de la aplicación y de la base de datos es baja.

Siempre me preocupa lo que sucederá si la base de datos deja de estar disponible: ¿esto evitaría que tu aplicación se ejecute o la degradaría de alguna manera? Iniciar sesión en el sistema de archivos evita tener que lidiar con ese problema, pero aún tendrá que preocuparse de que los discos se llenen y registren la rotación de archivos.

1

Inicie sesión en el DB solo si genera ingresos.

Por ejemplo, para un sitio, registramos todos los anuncios colocados en un sitio web en una base de datos. Generó ingresos. No hay razón para analizar archivos de registro por algo tan importante.

Todo lo demás va al sistema de archivos.

Inicie sesión en el sistema de archivos para la depuración. En general, es algo privado. Detalles de implementacion. No ser compartido.

Apache registra una montaña de cosas en el sistema de archivos. No duplique esto

Los registros de control de acceso van al sistema de archivos.Rara vez querrás verlos en detalle.

La actividad del usuario puede tener que resumirse en una base de datos. Esta es información de marketing y usabilidad que querrá estudiar para mejorar su sitio. Sin embargo, la información detallada de la actividad es demasiado voluminosa para registrarla en la base de datos. Póngalo en el sistema de archivos y digiérelo en una base de datos de análisis de comercialización/mejora del producto/usabilidad.

0

En caso de que considere modificar el registrador de Python estándar para iniciar sesión en una base de datos, esta receta podría darle una ventaja: Logging to a Jabber account.

0

Principalmente usaría el registro del sistema de archivos, tal como lo recomiendan la mayoría de las demás respuestas. Con el paquete de registro de Python, puede crear fácilmente un controlador de base de datos, adaptando la sugerencia hecha here. También puede crear una instancia de filtro personalizada y adjuntarla a su manejador de base de datos: esto le permitirá determinar exactamente en el tiempo de ejecución qué eventos realmente registra en la base de datos. En línea con otras respuestas, diría que solo vale la pena registrar algunos tipos de eventos en la base de datos para su posterior análisis.

Estoy de acuerdo con la recomendación de iniciar sesión en una base de datos separada (en un servidor separado) si su aplicación principal es de alto rendimiento.

0

El tipo de registro depende de lo que va a hacer con los datos y cómo va a hacerlo. Iniciar sesión en db es una ventaja si va a construir un sistema de informes basado en este registro db. De lo contrario, puede registrar las cosas en un formato específico que puede analizar más tarde si desea utilizar los datos para algún análisis. Por ejemplo, desde el registro de archivos puede analizar solo la información requerida y generar CSV como sea necesario. Si planea usar un registrador db, como ya se sugirió, hágalo por separado de su aplicación db.

En segundo lugar, puede considerar tener el registrador independiente de su aplicación principal. Genere un hilo que haga el registro, o ejecute un registrador en un puerto/socket específico y transmita los mensajes de registro al mismo, o recopile todos los mensajes de registro juntos y vacíelos en el registro al final de cada ciclo.

0

Hacemos ambas cosas.

Registramos información operativa/progreso/etc. al archivo de registro. Cosas estándar de archivos de registro.

En la base de datos, registramos los estados de las operaciones. P.ej. cada elemento que se procesa, por lo que podemos hacer consultas sobre el rendimiento/tiempo transcurrido/etc. Esta información es particularmente útil cuando se detectan y detectan anomalías (el sistema es "demasiado silencioso", etc.) que son potencialmente indicativos de otros problemas.

0

De hecho, parece importante que luego pueda cambiar entre el registro de base de datos/archivo. El registro de la base de datos parece ser mucho más lento que el registro de archivos de texto sin formato, que puede volverse importante con un alto tráfico de registro. He hecho una biblioteca (que puede actuar de forma independiente o como un controlador) cuando tenía el mismo requisito. Se registra en la base de datos y/o archivos, y permite archivar mensajes críticos (y el archivo puede, por ejemplo, ser una base de datos mientras que todo va en archivos de texto.) Puede ahorrarle la codificación de otro desde cero ... Ver: The rrlog library

0

Parece que muchos de ustedes están registrando algunos de los eventos en una base de datos. Estoy haciendo lo mismo, pero está agregando un poco de retraso. ¿Alguno de ustedes se registra en la base de datos a través de una cola de mensajes? Si es así, ¿qué usa para hacer cola y cómo es su arquitectura de registro? Estoy usando Java/J2EE.

Cuestiones relacionadas