Monitore um arquivo de log no Linux e envie cada linha para outro programa

2

Eu corro um servidor apt-cacher-ng no Ubuntu Linux que grava logs no seguinte formato:

1299745593|O|149406|XXX.XXX.XXX.XXX|uburep/pool/main/t/tiff/libtiff4_3.9.2-2ubuntu0.4_amd64.deb
1299745593|O|10154976|XXX.XXX.XXX.XXX|uburep/pool/main/l/linux-firmware/linux-firmware_1.34.4_all.deb     
1299748529|O|39368|XXX.XXX.XXX.XXX|uburep/pool/main/n/nagios-nrpe/nagios-nrpe-server_2.12-4ubuntu1_amd64.deb 
1300155440|O|680100|XXX.XXX.XXX.XXX|uburep/pool/main/t/tzdata/tzdata_2011c-0ubuntu0.10.04_all.deb

Ele mostra o timestamp, a direção (entrada ou saída), contagem de bytes, IP e nome do arquivo.

Toda vez que uma linha é escrita, eu também gostaria de enviar essa linha para outro programa. Eu vou ter este programa inserir a linha em um banco de dados para que eu possa triturar algumas estatísticas sobre o quanto de largura de banda estamos salvando através da operação de um servidor de cache.

Eu não quero cat do arquivo de log a cada X minutos (via cron ) procurando por novas entradas, já que seria um pouco computacionalmente antieconômico. Em vez disso, prefiro que um daemon monitore o log e, quando uma alteração for detectada, cada linha será enviada para meu script de inserção de banco de dados.

Será que swatch conseguirá isso ou haverá melhores opções?

    
por mlambie 15.03.2011 / 07:27

3 respostas

1

Dependendo de como você deseja ser daemon-y, você pode se safar com algo como:

tail -f $FILE | xargs -n 1 frobwidget.sh
    
por 15.03.2011 / 07:39
0

Se os logs estão sendo enviados através do syslog, você pode adicionar uma regra do syslog para enviá-los para outro local já. Como você irá depender do sabor do syslog que você está usando (ksyslogd, syslog-ng, rsyslog, etc).

Se não, a amostra parece uma boa solução para o problema.

Provavelmente, a única outra maneira que eu poderia pensar em fazer isso sem mexer mal as coisas é escrever seu script para abrir um pipe nomeado no lugar do local dos arquivos de log - e gravar os logs no banco de dados e um local alternativo no disco - mas isso exigiria que o pipe nomeado estivesse em vigor antes que o daemon do apt-cacher-ng fosse iniciado.

    
por 15.03.2011 / 07:37
0

Você já olhou para usando o syslog-ng para logar no mysql ? Usar um destino de pipe no syslog-ng é muito semelhante ao que você está tentando fazer.

    
por 15.03.2011 / 07:52