Os montes de informações gerados pelos bons serviços de log sobrecarregam o armazenamento e o grep. Será que acoplar o
syslog a um banco de dados ajuda?
Introdução
Há algum tempo implementei um servidor de logs baseado em
Debian no meu local de trabalho (até publiquei na comunidade
o artigo), o que nos resolveu muitos problemas, especialmente de espaço em disco nos demais servidores e de centralização das informações de log do datacenter.
Contudo, essa implementação nos trouxe um novo problema: depois de alguns meses, nosso servidor de log não estava comportando mais arquivos de log. Só nossos filtros de spam chegaram a registrar logfiles de mais de 1 GB por dia!
Um outro problema detectado é a demora do
grep para procurar uma informação em arquivos grandes, o que por vezes acabava fazendo com que o trabalho de obter estatísticas sobre nossos servidores se tornasse uma tarefa homérica e, por várias vezes, inviável, em decorrência do tempo demandado para a pesquisa e o tempo disponível para a apresentação dos resultados.
Existe uma solução relativamente simples de implementar e bastante eficiente pra resolver os problemas de armazenamento e, especialmente, de pesquisa aos logs gerados pelo syslog. Chama-se
Rsyslog.
O Rsyslog insere os logs diretamente num banco de dados MySQL ou PostgreSQL, o que significa que é possível substituir os comandos do grep por rápidos comandos SQL. O Rsyslog está disponível em várias distros e é o syslog padrão do
Fedora 8, por exemplo.
Implementando
Eu usei meu desktop como laboratório para a implementação do Rsyslog, um
Ubuntu 8.10. Ele utiliza o
sysklogd, o que facilita a migração para o Rsyslog. Inicialmente é possível até mesmo manter o arquivo
syslog.conf. Em sua maioria, o arquivo de configuração do Rsyslog tem o mesmo formato que o sistema legado, embora suporte algumas opções a mais para conexão a banco de dados.
Primeiramente é necessário instalar o pacote do Rsyslog. ele está disponível nos repositórios do Ubuntu e Debian, podendo ser instalado bastando executar o comando:
sudo apt-get install rsyslog rsyslog-mysql (para uso com MySQL)
ou
sudo apt-get install rsyslog rsyslog-pgsql (para uso com PostgreSQL)
Caso não encontre os pacotes do Rsyslog nos repositórios de sua distribuição, ou sua distribuição não utilize pacotes, você pode baixar o Rsyslog no site oficial do projeto (
www.rsyslog.com). Daí, é só descompactar e compilá-lo.
Configurando o banco de dados
Depois de instalado o rsyslog, vamos configurar o banco de dados para que possa receber os logs do syslogd.
É necessário que um dos bancos de dados (MySQL ou PostgreSQL) estejam previamente instalados na máquina. Não vou me delongar aqui sobre a instalação e configuração de banco de dados, por não ser o foco do artigo e existirem diversos artigos sobre o assunto já escritos.
Para isso, pode-se utilizar o assistente que é executado na instalação do rsyslog, ou executar o script "createDB.sql", que é fornecido junto com o pacote Rsyslog.
Em ambos os casos, um banco de dados chamado Syslog será criado, assim como todas as tabelas necessárias.
Em seguida, no prompt do MySQL (ou PostgreSQL), deve-se criar um usuário e e atribuir-lhe os privilégios:
mysql>
grant ALL ON Syslog.* to rsyslog@localhost identified by 'secret';
mysql>
flush privileges;
Depois é muito fácil ordenar o Rsyslog pra que use o banco de dados - bastam duas linhas no arquivo
/etc/rsyslog.d/mysql.conf (ou pgsql.conf, para o PostgreSQL):
#Carrega o módulo para acesso ao banco de dados MySQL
$ModLoad MySQL
# Define o recurso de log que contém as entradas que o Rsyslog deve inserir no banco de dados, seguido pelos parâmetros de acesso ao BD.
# Nome_da_Máquina.Nome_do_Banco_de_Dados.Usuário_MySQL.Senha
# No caso abaixo, apenas os logs do recurso de e-mail serão gravados no banco de dados.
mail.* > localhost.Syslog.rsyslog.secret
Após implementado, verifiquei meu banco de dados e vi que ele já estava gravando os logs no MySQL, como demonstra a figura abaixo:
Não é a solução definitiva do problema, principalmente quanto ao armazenamento, mas facilita e muito a procura por algum log específico dentro do servidor de logs.
Fonte:
Linux Magazine: n° 43 - junho/08, pg 10