tail -f equivalente ao banco de dados de log do MySQL

12

Foi decidido que deveríamos usar um banco de dados (MySQL) para nossos logs de aplicativos (é um aplicativo Java usando a lib de logback). Espero encontrar algo assim tail -fque possa ser usado com uma tabela específica nesse banco de dados que me mostrará novas linhas à medida que forem adicionadas (semelhante à maneira como tail -ffuncionou nos arquivos de log).

Nick Spacek
fonte

Respostas:

5

Ative o registro binário do MySQL. Em seguida, você pode usar o mysqlbinlogcomando para ver todas as instruções de modificação de dados.

200_success
fonte
você pode mostrar um exemplo de como fazer isso no idioma de sua escolha ou com o bash?
Alexander Mills
7

Não acho que algumas pessoas entendam a pergunta (ou não). Você não deseja registrar as consultas no banco de dados; em vez disso, um log de um aplicativo está entrando em um banco de dados. Se fosse um arquivo, você poderia ajustar o log. Como você adapta uma tabela para que, quando uma nova linha é adicionada, ela seja impressa?

Não deve ser difícil escrever um loop simples para lidar com isso, supondo que você tenha um campo exclusivo que aumente monotonicamente ao longo do tempo (por exemplo, um número de sequência).

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
fonte
isso se chama polling e não é tão divertido :) mas suponho que seja uma boa técnica, se você precisar usar polling.
Alexander Mills
3

Parece que muitos de nós não entendemos bem sua pergunta. O que você quer dizer com "banco de dados de log" , que não é um termo padrão do MySQL.

Use o MySQL General Query Log , que registra cada instrução recebida de um cliente.

Você pode então definir log_output = TABLE no seu my.cnf. O arquivo será gravado em $ mysql_data_directory / general_log.CSV. Você pode tail -feste arquivo para visualizar consultas em tempo real.

Stefan Lasiewski
fonte
2

Aqui está o que eu uso. Parece a solução mais simples, embora não seja muito eficiente:

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

Jud
fonte
1

Você pode fazer isso de maneira hacky usando tail -f no arquivo de banco de dados (/var/lib/mysql/database_name/table_name.MY*) e executando sua consulta sempre que uma linha for lida.

James L
fonte
1

Sugiro adicionar um campo de carimbo de data / hora a qualquer tabela que você deseja seguir. Isso permitirá que você obtenha os resultados desejados com muita facilidade com uma simples consulta.

John Gardeniers
fonte