Eu tenho cerca de 30 servidores e apenas uso o syslog direto para enviar todos os logs para um único servidor de log. Para backup, todas as máquinas também são configuradas para armazenar seus próprios logs localmente por alguns dias, usando logrotate para cuidar da rotação e exclusão de logs antigos.
Cada um dos meus servidores de aplicativos executa um pequeno script perl para enviar seus logs para o syslog, que depois encaminha para o host de log (script perl abaixo).
Em seguida, no host de log, temos alguns scripts personalizados semelhantes à verificação de log que basicamente observam os logs recebidos quanto a qualquer coisa suspeita.
Também temos todo o email de todos os hosts indo para um local, para que, se algum programa reclamar dessa maneira, recebamos todas as mensagens. Teoricamente, isso poderia ir para uma única caixa de correio na qual um programa poderia atuar e analisar.
Aqui está o meu script perl de log. Ele funciona direcionando a saída do programa para ele e, em seguida, syslogs a saída e cospe de volta para que você possa enviá-la para outro lugar (envio para multilog). Você também pode dar a opção -q para acessar o syslog.
#!/usr/bin/perl
use Sys::Syslog;
use Getopt::Long;
$SERVER_NAME = `hostname`;
chomp $SERVER_NAME;
$FACILITY = 'local0';
$PRIORITY = 'info';
GetOptions ('s=s' => \$SERVER_NAME, 'f=s' => \$FACILITY, 'p=s' => \$PRIORITY, 'q+' => \$quiet);
#print "$SERVER_NAME\n$FACILITY\n$PRIORITY\n";
#Sys::Syslog::setlogsock('unix');
openlog ($SERVER_NAME,'ndelay',$FACILITY);
if (!($quiet)) {syslog($PRIORITY,"Logging Started -- Logger version 1.1");}
$| = 1;
while (<>) {
if (!($quiet)) {print $_ unless $_ =~ /^\s+$/};
chomp;
syslog($PRIORITY,$_) if $_;
}
closelog;
$| = 0;