Se você tem syslog-ng
(provavelmente rsyslogd
também) como syslog-daemon, você pode usar isso.
Basta configurá-lo para ficar de olho no arquivo de log do Apache ou, alternativamente, configurar o Apache para enviar logs para o recurso de syslog com CustomLog
directive e logger
.
O daemon Syslog então usará correspondência de padrões e executará $ foo se alguma correspondência for encontrada. Por exemplo, no syslog-ng você pode configurar um gancho de arquivo de log e filtrá-lo assim:
source apache_log { file("/var/log/apache2/access.log"); };
filter apache_match { match("GET /evilscript.php"); };
E, em seguida, syslog-ng chama o script externo
destination apache_logmatch_script { program("/usr/local/bin/apachematch.pl"); };
Por fim, coloque todos juntos:
log { source(apache_log); filter(apache_match); destination apache_logmatch_script); };
Se você usar essa técnica, o syslog-ng gerará o plano de fundo do seu script esperando que novas coisas apareçam. Por causa disso, você precisa modificar seus scripts para aguardar a entrada de STDIN; aqui está um pequeno exemplo de Perl:
#!/usr/bin/perl -w
$|=1;
while (<>) {
printf "Stuff happened, I got this entry: %s!\n", $_;
}
Não vou mais fundo com a minha resposta até saber que você quer tentar essa técnica.