web-dev-qa-db-fra.com

Connectez-vous à la base de données au lieu des fichiers journaux

Je suis intéressé à envoyer tous les Rails application logging à une base de données (MySQL ou MongoDB) en plus ou à la place d'un fichier journal. Il y a plusieurs raisons, dont la plupart sont concernées à propos de l'analyse des fichiers journaux. Nous utilisons déjà Google Analytics, mais il y a une variété de choses que nous voulons faire qui ne sont pas aussi réalisables dans Analytics.

De plus, j'aimerais effectuer une enquête "en temps réel" sur les problèmes en consultant les journaux. Passer au crible un fichier journal est une façon fastidieuse de le faire, et j'aimerais faire une meilleure recherche et un meilleur filtrage qu'un fichier journal ne le permet (facilement).

Enfin, je veux souvent examiner quelque chose de plus proche du comportement des visiteurs du site: tracer le chemin à travers le site par exemple, afin que je puisse voir la dernière page qu'un utilisateur consultait avant qu'une erreur ne se produise. Étant donné que nous avons plusieurs serveurs d'applications, les fichiers journaux séparés en font une véritable douleur. Si toutes les données étaient dans une base de données, je pourrais alors facilement voir la séquence appropriée de pages pour un visiteur donné. Je sais que Syslog serait un moyen de résoudre ce problème particulier (fichier journal/référentiel unique), mais je veux combiner cela avec de meilleures capacités de recherche que j'associe aux recherches de base de données.

Je me demande ce que les gens recommandent pour résoudre ce problème. Vous connectez-vous directement à une base de données ou videz-vous des fichiers journaux dans une base de données (mais quelle est votre approche pour que ce soit essentiellement en temps réel/aussi à jour que le fichier journal lui-même)?

Je suis en train de déterminer à quel niveau j'aimerais cette journalisation, car une autre chose que j'ai regardée est d'écrire un petit filtre en rack qui consignerait toutes les demandes. Cela manquerait toute la sortie supplémentaire que la journalisation normale Rails décharge (tous les SQL et la sortie sur les occurrences et les échecs du cache, etc.), mais cela atteindrait une grande partie de mon objectif, et semble avoir l'avantage de ne rien déranger d'autre dans le système.

Quoi qu'il en soit, je ne cherche pas une bonne réponse, plus une discussion et des informations sur ce que quelqu'un d'autre pourrait faire dans cette même optique.

63
chrisrbailey

Mon entreprise enregistre des informations de trafic structurées directement dans une base de données de journaux MySQL. Cette base de données est répliquée en aval vers une autre base de données. Toutes les analyses exécutent la réplication finale de la base de données. Notre site supporte pas mal de trafic. Jusqu'à présent, il ne semble pas avoir de problème majeur. Cependant, notre service informatique est de plus en plus préoccupé par l’évolutivité de la configuration actuelle et propose de décharger les informations de journal sur des fichiers journaux "appropriés". Les fichiers journaux seront ensuite réinsérés dans les mêmes tables de base de données en aval. Ce qui m'amène à cette question. :)

Voici quelques avantages et inconvénients que je vois concernant le sujet des fichiers journaux vs log-db (relationnel):

  • les fichiers journaux sont rapides, fiables et évolutifs (au moins, j'ai entendu que Yahoo! fait un usage intensif des fichiers journaux pour leurs analyses de suivi des clics).
  • les fichiers journaux sont faciles à gérer pour sys-admin.
  • les fichiers journaux peuvent être très flexibles car vous pouvez y écrire presque n'importe quoi.
  • les fichiers journaux nécessitent une analyse approfondie et potentiellement un type de configuration à carte réduite pour l'extraction des données.
  • les structures log-db sont beaucoup plus proches de votre application, ce qui raccourcit considérablement le délai d'exécution de certaines fonctionnalités. Cela peut être une bénédiction ou une malédiction. Probablement une malédiction à long terme, car vous vous retrouverez très probablement avec une application hautement couplée et une base de code analytique.
  • log-db peut réduire les bruits de journalisation et les redondances car les fichiers journaux ne sont insérés que là où log-db vous donne la possibilité de faire la mise à jour et l'insertion associée (normalisation si vous osez).
  • log-db peut également être rapide et évolutif si vous optez pour un partitionnement de base de données et/ou des bases de données multi-journaux (rejoindre des données via des réplications en aval)

Je pense que certains tests de résistance sur la base de données de journaux sont nécessaires dans ma situation. De cette façon, au moins, je sais combien de marge j'ai.

Récemment, je me suis penché sur certaines bases de données basées sur des valeurs-clés/documents comme Redis, Tokyo Cabinet et MongoDB. Ces bases de données à insertion rapide peuvent potentiellement être le point idéal car elles offrent des capacités de persistance, de débit élevé (en écriture) et d'interrogation à des degrés divers. Ils peuvent rendre le processus d'extraction de données beaucoup plus simple que l'analyse et la réduction de carte via des fichiers de journaux.

À long terme, je pense qu'il est essentiel d'avoir un entrepôt de données analytiques robuste. La libération des données d'application des données analytiques et vice versa peut être un gros gain.


Enfin, je voudrais simplement souligner qu'il existe de nombreuses questions similaires/étroitement liées ici sur StackOverflow au cas où vous souhaiteriez élargir votre discussion.


Éditer:

rsyslog semble très intéressant. Il vous donne la possibilité d'écrire directement sur MySQL. Si vous utilisez Ruby, vous devriez jeter un œil à la gemme de journalisation. Il offre des capacités de journalisation multi-cibles. C'est vraiment sympa.

41
newtonapple

Si vous souhaitez modifier le comportement de journalisation par défaut, créez simplement un objet de journalisation personnalisé qui répond à toutes les méthodes de journalisation Rails:

  • ajouter
  • debug, warn, error, info, fatal, unknown

http://github.com/Rails/rails/blob/9d7aae710384fb5f04129c35b86c5ea5fb9d83a9/activesupport/lib/active_support/buffered_logger.rb

Parce que c'est votre enregistreur, vous pouvez décider d'implémenter votre logique personnelle. Vous pouvez écrire dans la base de données, sur la sortie standard à tout moment.

Ensuite, remplacez l'enregistreur par défaut pour chaque classe de base que vous souhaitez personnaliser.

ActiveRecord::Base.logger = YouLogger.new

Vous pouvez facilement créer un fichier d'initialisation appelé logger.rb et y écrire toutes vos configurations personnalisées. De cette façon, l'enregistreur sera immédiatement remplacé au démarrage Rails.

9
Simone Carletti

J'utilise le Rails "exception logger" , pour enregistrer tous les problèmes dans ma base de données pendant que mon site est en mode production. Cela vous donnera une interface agréable où vous pourrez vérifiez les problèmes. Si vous voulez voir ce que font vos visiteurs en temps réel, jetez un œil à woopra

3
atmorell

Chris,

Je pense que le commentaire de Dima est important ici. Êtes-vous satisfait (1) d'avoir un journal d'accès dans une base de données (en temps réel), ou (2) êtes-vous plus intéressé par la journalisation Rails/application spécifique?

Pour (1), avec Apache (au moins), vous pouvez vous connecter à une base de données à l'aide de la journalisation canalisée.

http://httpd.Apache.org/docs/1.3/logs.html#piped

J'ai écrit un programme qui s'exécute en arrière-plan en attente d'entrée, qu'il analyse et enregistre dans une base de données Postgres. Mon fichier httpd.conf redirige vers ce programme avec une directive CustomLog.

C'est relativement simple à configurer et vous donne tous les avantages évidents de pouvoir analyser vos journaux dans une base de données. Cela fonctionne très bien pour moi, en particulier pour retracer ce qu'un utilisateur faisait juste avant une erreur. Cependant, vous devez vous protéger contre l'injection SQL, les dépassements de tampon et d'autres problèmes de sécurité dans le programme de journalisation.

Pour (2), je ne suis pas un développeur Rails, je ne peux donc parler que des approches générales. Si vous souhaitez enregistrer des variables d'environnement, des données d'application ou des informations très sélectives, vous pouvez Envisagez d'écrire un module de serveur Web. Selon vos besoins précis, vous pouvez également vous débrouiller avec une combinaison de directives de journalisation conditionnelle et de filtrage dans le programme de journalisation.

Cela dépend vraiment de savoir si vous avez besoin d'une solution spécifique à Rails ou d'une solution plus générale à l'échelle du serveur Web.

1
Nishad

Ayant moi-même fait l'erreur de me connecter à une base de données récemment, je pense pouvoir proposer une très bonne raison pour laquelle vous ne devriez pas faire cela: les transactions. Disons que vous démarrez une transaction, enregistrez un tas de choses au cours de la transaction et que vous vous retrouvez avec une condition d'erreur. Vous enregistrez la condition d'erreur, et oh hé. ROLLBACK. Soudain, tout ce que vous venez de connecter a disparu et vous n'avez aucune idée de ce qui s'est passé ou pourquoi.

Et en particulier dans le contexte de Rails, où des bibliothèques vraiment utiles comme AASM encapsuleront tout un tas de choses dans une transaction, vous pouvez vous retrouver avec des transactions dans des endroits que vous ne pensiez pas, ce qui rend également le problème très difficile à déboguer .

Dans mon cas, la raison pour laquelle j'ai enregistré des choses dans la base de données était que j'avais besoin de journaux contextuels. Essentiellement, je devais pouvoir rechercher toutes les entrées de journal liées à un modèle de base de données spécifique. Cependant, la bonne réponse consiste à placer ces journaux dans un emplacement séparé qui convient mieux aux données de journal (et qui, dans mon cas, peut être interrogeable).

1
Bob Aman

comme aucune réponse n'a été acceptée jusqu'à présent, je donnerai ma contribution

j'ai développé un plugin pour rsylog pour enregistrer les journaux non pas dans des fichiers mais sur mongodb

le code source entier, de rsyslog + plugin est ici https://github.com/vpereira/rsyslogd-mongo

pour le compiler, vous devez simplement exécuter ./configure --help et voir les options disponibles.

1
VP.