ruby-on-rails - print - ruby logger levels
Inicie sesiĆ³n en la base de datos en lugar de archivos de registro (6)
Estoy interesado en enviar todos los registros de la aplicación Rails a una base de datos (MySQL o MongoDB), además de o en lugar de a un archivo de registro. Hay algunas razones, la mayoría de las cuales están preocupadas por el análisis de archivos de registro. Ya usamos Google Analytics, pero hay una variedad de cosas que queremos hacer que no son viables en Analytics.
Además, me gustaría hacer una investigación "en tiempo real" de los problemas observando los registros. Examinar un archivo de registro es una manera tediosa de hacerlo, y me gustaría hacer una mejor búsqueda y filtrado de lo que permite un archivo de registro (fácilmente).
Finalmente, a menudo quiero examinar algo más cercano al comportamiento del visitante del sitio: rastrear la ruta a través del sitio, por ejemplo, para poder ver cuál era la última página que un usuario estaba mirando antes de que ocurriera un error. Dado que tenemos varios servidores de aplicaciones, los archivos de registro por separado lo hacen un verdadero dolor. Si todos los datos estuvieran en una base de datos, podría ver fácilmente la secuencia adecuada de páginas para un visitante determinado. Sé que Syslog sería una forma de resolver esta cosa en particular (archivo de registro único / repositorio), pero quiero combinar eso con mejores habilidades de búsqueda que asocio con las búsquedas de bases de datos.
Me pregunto qué recomiendan las personas para resolver esto. ¿Te conectas directamente a una base de datos, o viertes archivos de registro en un DB (pero cuál es tu enfoque para eso, de modo que es esencialmente en tiempo real / tan actualizado como el archivo de registro mismo)?
Actualmente estoy determinando a qué nivel me gustaría este registro, porque otra cosa que miré es escribir un pequeño filtro de Rack que registraría todas las solicitudes. Esto extrañaría todo el rendimiento extra que el registro normal de Rails desecha (todo el SQL y la salida en éxitos y fallas de la caché, etc.), pero alcanzaría una gran parte de mi objetivo, y parece tener la ventaja de no perturbar cualquier otra cosa en el sistema.
De todos modos, no estoy buscando una respuesta correcta, más una discusión e información sobre lo que cualquier otra persona podría estar haciendo bajo esta misma luz.
Chris,
Creo que el comentario de Dima es importante aquí. ¿Está satisfecho con (1) tener un registro de acceso en un DB (en tiempo real), o (2) está más interesado en Rails / logging específico de la aplicación?
Para (1), con Apache (al menos), puede iniciar sesión en una base de datos utilizando el registro por tuberías.
http://httpd.apache.org/docs/1.3/logs.html#piped
Escribí un programa que se ejecuta en segundo plano a la espera de la entrada, que analiza y se registra en una base de datos de Postgres. Mi archivo httpd.conf funciona con este programa con una directiva CustomLog.
Esto es relativamente simple de configurar y le ofrece todas las ventajas obvias de poder analizar sus registros en una base de datos. Funciona muy bien para mí, especialmente para rastrear lo que un usuario estaba haciendo justo antes de un error. Sin embargo, debe protegerse contra la inyección de sql, los desbordamientos de búfer y otros problemas de seguridad en el programa de registro.
Para (2), no soy un desarrollador de Rails, así que solo puedo hablar sobre enfoques generales. Si desea registrar vars de entorno, o datos de aplicaciones, o bits de información muy selectivos, podría considerar escribir un módulo de servidor web. Dependiendo de sus necesidades exactas, también podría salir adelante con alguna combinación de directivas de registro condicional y filtrado en el programa de registro.
Realmente se trata de si necesita una solución específica de Rails o una solución más general para todo el servidor web.
Después de haber cometido el error de iniciar sesión en una base de datos recientemente, creo que puedo ofrecer una muy buena razón por la que no debe hacer esto: Transacciones. Digamos que inicias una transacción, registras un montón de cosas durante el curso de la transacción y finalmente terminas con una condición de error. Usted registra la condición de error, y oh hola. ROLLBACK
. De repente, todo lo que acabas de registrar se va y no tienes idea de lo que pasó o por qué.
Y particularmente en el contexto de Rails, donde bibliotecas muy útiles como AASM envolverán un montón de cosas en una transacción, puedes terminar con transacciones en lugares que no creías que harías, lo que también hace que el problema sea muy difícil de depurar. .
En mi caso, la razón por la que registré cosas en la base de datos fue porque necesitaba registros contextuales. Esencialmente, necesitaba poder buscar todas las entradas de registro relacionadas con un modelo de base de datos específico. Sin embargo, la respuesta correcta es poner esos registros en una ubicación separada que se ajuste mejor a los datos de registro (y que, en mi caso, es factible consultar).
Mi empresa ha estado registrando información de tráfico estructurado directamente en una base de datos de registro MySQL. Esta base de datos se replica en sentido descendente a otra base de datos. Todos los análisis se ejecutan en la replicación final de la base de datos. Nuestro sitio soporta bastante tráfico. Hasta ahora, no parece tener ningún problema importante. Sin embargo, nuestro departamento de TI tiene algunas preocupaciones crecientes con respecto a la escalabilidad de la configuración actual y está sugiriendo que descarguemos la información de registro en archivos de registro "adecuados". Los archivos de registro se reinsertarán nuevamente en las mismas tablas de la base de datos en sentido descendente. Lo que me lleva a esta pregunta. :)
Estos son algunos de los pros y contras que veo con respecto al tema de los archivos de registro vs log-db (relacional):
- los archivos de registro son rápidos, confiables y escalables (al menos he escuchado que Yahoo! hace un gran uso de los archivos de registro para su análisis de seguimiento de clics).
- los archivos de registro son fáciles de mantener para sys-admin.
- los archivos de registro pueden ser muy flexibles ya que puede escribirle casi cualquier cosa.
- los archivos de registro requieren un análisis detallado y, potencialmente, un tipo de configuración de mapa reducido para la extracción de datos.
- Las estructuras log-db están mucho más cerca de su aplicación, lo que hace que el tiempo de respuesta de algunas funciones sea mucho más corto. Esto puede ser una bendición o una maldición. Probablemente sea una maldición a largo plazo, ya que lo más probable es que termines con una aplicación altamente acoplada y una base de código analítico.
- log-db puede reducir los ruidos de registro y las redundancias, ya que los archivos de registro solo se insertan cuando log-db le brinda la capacidad de actualizar e insertar asociado (normalización si se atreve).
- log-db también puede ser rápido y escalable si va con particiones de base de datos y / o bases de datos de registros múltiples (vuelve a unir datos mediante replicaciones posteriores)
Creo que algunas pruebas de estrés en la base de datos de registro son necesarias en mi situación. De esta forma, al menos sé cuánto espacio libre tengo.
Recientemente, he estado buscando en algunas bases de datos de valores clave / documentos como Redis, Tokyo Cabinet y MongoDB. Estas bases de datos de inserción rápida pueden ser el punto ideal ya que proporcionan persistencia, altos rendimientos (de escritura) y capacidades de consulta en diversos grados. Pueden hacer que el proceso de extracción de datos sea mucho más simple que el análisis y la reducción de mapas a través de gigs de archivos de registro.
A largo plazo, creo que es crucial contar con un sólido almacén de datos analíticos. Liberar los datos de las aplicaciones de los datos analíticos y viceversa puede ser un gran éxito.
Por último, me gustaría señalar que hay muchas preguntas similares relacionadas en en caso de que quiera ampliar su discusión.
- Almacenamiento de muchos archivos de registro
- Es una buena idea escribir archivos de registro del servidor en una base de datos?
- Usando un Servidor SQL para el registro de aplicaciones. ¿Pros contras?
- Búsqueda rápida en registros
- Base de datos de producción separada para el registro
- Usted inicia sesión en su base de datos, ¿dónde se registra cuando su base de datos no funciona?
Editar:
rsyslog ve muy interesante. Le da la capacidad de escribir directamente a MySQL. Si está usando Ruby, debería echarle un vistazo a la gema de registro. Proporciona capacidades de registro de objetivos múltiples. Es realmente bueno.
Si desea cambiar el comportamiento de registro predeterminado, simplemente cree un objeto de registro personalizado que responda a todo el método de registro de Rails:
- añadir
- depurar, advertir, error, información, fatal, desconocido
Debido a que es su registrador, puede decidir implementar su lógica personal. Puede escribir en la base de datos, a la salida estándar de cuando lo desee.
Luego, reemplace el registrador predeterminado para cada clase base que desee personalizar.
ActiveRecord::Base.logger = YouLogger.new
Puede crear fácilmente un archivo de inicializador llamado logger.rb y escribir allí todas sus configuraciones personalizadas. De esta forma, el registrador se reemplazará inmediatamente en el inicio de Rails.
Utilizo el "registrador de excepciones" de los rieles para registrar todos los problemas en mi base de datos mientras mi sitio está en modo de producción. Le dará una interfaz agradable donde puede verificar si hay problemas. Si quieres ver lo que tus visitantes están haciendo en tiempo real, eche un vistazo a woopra
como ninguna respuesta fue aceptada hasta ahora, daré mi contribución
desarrollé un complemento para rsylog para guardar los registros no en archivos, sino en mongodb
el código fuente completo, desde el complemento rsyslog + está aquí https://github.com/vpereira/rsyslogd-mongo
para compilarlo, solo debe ejecutar ./configure --help y ver las opciones disponibles.