équivalent -f pour la base de données de journalisation MySQL

12

Il a été décidé que nous devrions passer à l'utilisation d'une base de données (MySQL) pour nos journaux d'application (il s'agit d'une application Java utilisant la bibliothèque logback). J'espère trouver quelque chose comme tail -fça que je peux utiliser avec une table spécifique dans cette base de données qui me montrera de nouvelles lignes au fur et à mesure qu'elles sont ajoutées (similaire à la façon dont tail -ffonctionnait les fichiers journaux).

Nick Spacek
la source

Réponses:

5

Activez la journalisation binaire MySQL. Ensuite, vous pouvez utiliser la mysqlbinlogcommande pour voir toutes les instructions de modification des données.

200_success
la source
pouvez-vous montrer un exemple de la façon de procéder dans la langue de votre choix ou avec bash?
Alexander Mills
7

Je ne pense pas que certaines personnes comprennent la question (ou je ne comprends pas). Vous ne voulez pas enregistrer les requêtes sur la base de données; un journal d'une application va plutôt dans une base de données. S'il s'agissait d'un fichier, vous pourriez suivre le journal. Comment pouvez-vous suivre un tableau de sorte que lorsqu'une nouvelle ligne est ajoutée, elle soit sortie?

Il ne devrait pas être trop difficile d'écrire une boucle simple pour gérer cela, en supposant que vous avez un champ unique qui augmente de façon monotone au fil du temps (par exemple, un numéro de séquence).

current_pos = select max(seq) from table
while true
  new_pos = select max(seq) from table
  if new_pos > current_pos
    select * from table where seq > current_pos
    current_pos = new_pos
  endif
  sleep 1
endwhile
Mark Wagner
la source
c'est ce qu'on appelle l'interrogation et ce n'est pas très amusant :) mais une bonne technique je suppose, si vous devez utiliser l'interrogation.
Alexander Mills
3

Il semble que beaucoup d'entre nous ne comprennent pas très bien votre question. Qu'entendez-vous par «base de données de journalisation» , qui n'est pas un terme MySQL standard.

Utilisez le journal des requêtes générales MySQL , qui enregistre chaque instruction reçue d'un client.

Vous pouvez ensuite définir log_output = TABLE dans votre my.cnf. Le fichier sera écrit dans $ mysql_data_directory / general_log.CSV. Vous pouvez tail -fce fichier pour afficher les requêtes en temps réel.

Stefan Lasiewski
la source
2

Voici ce que j'utilise. Semble la solution la plus simple, bien qu'elle ne soit pas très efficace:

watch "mysql db_name -e '(SELECT * FROM my_table ORDER BY id DESC LIMIT 10) ORDER BY id ASC;'"

Jud
la source
1

Vous pouvez le faire de manière hacky en utilisant tail -f sur le fichier de base de données (/var/lib/mysql/database_name/table_name.MY*), puis en exécutant votre requête chaque fois qu'une ligne est lue.

James L
la source
1

Je suggère d'ajouter un champ d'horodatage à n'importe quelle table que vous souhaitez suivre. Cela vous permettra d'obtenir très facilement les résultats souhaités avec une simple requête.

John Gardeniers
la source