tail -f setara untuk database logging MySQL

12

Diputuskan bahwa kita harus pindah ke menggunakan database (MySQL) untuk log aplikasi kita (ini adalah aplikasi Java menggunakan lib logback). Saya berharap menemukan sesuatu seperti tail -fitu yang bisa saya gunakan dengan tabel khusus dalam database yang akan menunjukkan kepada saya baris baru ketika mereka ditambahkan (mirip dengan cara tail -fbekerja pada file log).

Nick Spacek
sumber

Jawaban:

5

Aktifkan pencatatan biner MySQL. Kemudian Anda bisa menggunakan mysqlbinlogperintah untuk melihat semua pernyataan pengubah data.

200_sukses
sumber
dapatkah Anda menunjukkan contoh bagaimana melakukan ini dalam bahasa pilihan Anda atau dengan bash?
Alexander Mills
7

Saya tidak berpikir beberapa orang mengerti pertanyaan (atau saya tidak). Anda tidak ingin mencatat kueri terhadap DB; bukan log dari aplikasi yang masuk ke DB. Jika itu file, Anda bisa mengekor log. Bagaimana Anda mengekor tabel sehingga ketika baris baru ditambahkan itu adalah output?

Seharusnya tidak sulit untuk menulis loop sederhana untuk menangani ini, dengan asumsi Anda memiliki bidang unik yang meningkat secara monoton dari waktu ke waktu (misalnya, nomor urut).

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
sumber
ini disebut polling dan itu tidak terlalu menyenangkan :) tetapi teknik yang baik saya kira, jika Anda harus menggunakan polling.
Alexander Mills
3

Tampaknya banyak dari kita tidak begitu mengerti pertanyaan Anda. Apa yang Anda maksud dengan "logging database" , yang bukan istilah MySQL standar.

Gunakan MySQL General Query Log , yang mencatat setiap pernyataan yang diterima dari klien.

Anda kemudian dapat mengatur log_output = TABEL di my.cnf Anda. File akan ditulis ke $ mysql_data_directory / general_log.CSV. Anda dapat tail -ffile ini untuk melihat permintaan secara real time.

Stefan Lasiewski
sumber
2

Inilah yang saya gunakan. Tampaknya solusi paling sederhana, meskipun tidak terlalu efisien:

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

Jud
sumber
1

Anda bisa melakukannya dengan cara hacky dengan menggunakan tail -f pada file database (/var/lib/mysql/database_name/table_name.MY*) dan kemudian menjalankan kueri Anda setiap kali sebuah baris dibaca.

James L.
sumber
1

Saya sarankan menambahkan bidang cap waktu ke tabel apa pun yang ingin Anda buntuti. Itu akan memungkinkan Anda untuk mendapatkan hasil yang diinginkan dengan sangat mudah dengan permintaan sederhana.

John Gardeniers
sumber