tail -f entspricht der MySQL-Protokollierungsdatenbank

12

Es wurde beschlossen, eine (MySQL-) Datenbank für unsere Anwendungsprotokolle zu verwenden (es handelt sich um eine Java-App, die die Logback-Bibliothek verwendet). Ich hoffe, so etwas zu finden, tail -fdas ich mit einer bestimmten Tabelle in dieser Datenbank verwenden kann, die mir beim Hinzufügen neue Zeilen anzeigt (ähnlich wie tail -fbei Protokolldateien).

Nick Spacek
quelle

Antworten:

5

Aktivieren Sie die MySQL-Binärprotokollierung. Anschließend können Sie mit dem mysqlbinlogBefehl alle datenmodifizierenden Anweisungen anzeigen.

200_Erfolg
quelle
Können Sie ein Beispiel dafür in der Sprache Ihrer Wahl oder mit Bash zeigen?
Alexander Mills
7

Ich glaube nicht, dass manche Leute die Frage verstehen (oder ich nicht). Sie möchten die Abfragen nicht für die Datenbank protokollieren. Vielmehr wird ein Protokoll einer Anwendung in eine Datenbank verschoben. Wenn es eine Datei wäre, könnten Sie das Protokoll verfolgen. Wie können Sie eine Tabelle so gestalten, dass beim Hinzufügen einer neuen Zeile diese ausgegeben wird?

Es sollte nicht zu schwierig sein, eine einfache Schleife zu schreiben, um dies zu handhaben, vorausgesetzt, Sie haben ein eindeutiges Feld, das mit der Zeit monoton zunimmt (z. B. eine Sequenznummer).

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
quelle
Dies nennt man Polling und es macht nicht so viel Spaß :), aber eine gute Technik, wenn Sie Polling verwenden müssen.
Alexander Mills
3

Es scheint, dass viele von uns Ihre Frage nicht ganz verstehen. Was meinen Sie mit "Protokollierungsdatenbank" , was kein Standardbegriff für MySQL ist ?

Verwenden Sie das allgemeine MySQL -Abfrageprotokoll , das jede von einem Client empfangene Anweisung protokolliert.

Sie können dann log_output = TABLE in Ihrer my.cnf setzen. Die Datei wird in $ mysql_data_directory / general_log.CSV geschrieben. Mit tail -fdieser Datei können Sie Abfragen in Echtzeit anzeigen.

Stefan Lasiewski
quelle
2

Folgendes benutze ich. Scheint die einfachste Lösung zu sein, obwohl sie nicht sehr effizient ist:

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

Jud
quelle
1

Sie können dies auf hackige Weise tun, indem Sie tail -f für die Datenbankdatei (/var/lib/mysql/database_name/table_name.MY*) verwenden und dann Ihre Abfrage jedes Mal ausführen, wenn eine Zeile gelesen wird.

James L.
quelle
1

Ich schlage vor, jeder Tabelle, die Sie verfolgen möchten, ein Zeitstempelfeld hinzuzufügen. Auf diese Weise können Sie mit einer einfachen Abfrage ganz einfach die gewünschten Ergebnisse erzielen.

John Gardeniers
quelle