Logstash + Redis + Elasticsearch + Kibana - Gerenciando logs

O Logstash é um sistema para gerenciamento e agregação de logs. Neste artigo, veremos como configurar o Logstash para coletar, processar e armazenar logs e como configurar uma interface Web para visualizar e analisar os logs. Este roteiro irá mostrar também, como montar um ambiente para centralizar logs de diversos servidores.

[ Hits: 40.425 ]

Por: Luiz Augusto Amelotti em 10/09/2012


Ambiente distribuído



Já vimos como o Logstash funciona, de maneira bem simples.

Agora, vamos partir para a configuração de um ambiente distribuído, e usando uma interface Web com mais recursos. Neste ambiente, teremos dois tipos de máquinas: máquinas que enviam as mensagens e máquinas que coletam e indexam as mensagens.

Nas máquinas do primeiro tipo, iremos usar apenas o Logstash, já que elas apenas lêem as mensagens das aplicações de origem e aplicam alguns filtros.

No segundo tipo de máquina, iremos coletar e armazenar as mensagens. Do primeiro tipo, teremos várias máquinas, já do segundo, apenas uma (ou algumas poucas, no caso de uma carga muito grande de acessos).

Por isso, para que o ambiente consiga tratar uma grande quantidade de mensagens, iremos usar o Redis, como uma fila que vai receber as mensagens dos hosts que enviam as mensagens, o Logstasg para tratar e indexar as mensagens, o Elasticsearch para armazenar e o Kibana para visualizar as mensagens.

Crie as pastas /opt/monitor/logstash/{bin,conf,log} nos dois tipos de máquinas - já que todas elas irão executar uma instância do Logstash.

Faça o download do Logstash na pasta bin - lembre-se do pré-requisito de ter o Java instalado.

Nas máquinas que enviarão as mensagens, crie um arquivo de configuração para o Logstash, na pasta /opt/monitor/logstash/conf, chamado "shipper.conf", com o seguinte conteúdo:

input { stdin { type => "stdin-type" } }
output { redis { host => "<endereço IP do redis server>" data_type => "list" key => "logstash" } }


Substituindo <endereço IP do redis server>, pelo endereço IP (ou DNS hostname) do servidor que vai executar o Redis.

Já na máquina que vai agregar, indexar e armazenar as mensagens, crie um arquivo chamado "indexer.conf", na pasta /opt/monitor/logstash/conf, com o seguinte conteúdo:

input { redis { host => "127.0.0.1" type => "redis-input" data_type => "list" key => "logstash" message_format => "json_event" } }
output { elasticsearch { host => "127.0.0.1" } }


Aqui, o Elasticsearch vai executar na mesma máquina que o Redis e o Logstash indexer, mas é possível ter cada componente em seu próprio servidor, sem nenhum prejuízo de desempenho ou configuração - apenas lembrando de usar os endereços corretos.

Faça o download do Elasticsearch, disponível em:
Visite a página do Elasticsearch e verifique a versão mais recente, na pasta /opt/monitoring, descompacte o arquivo e renomeie a pasta criada para: elasticsearch

Crie uma pasta para os logs (o pacote do Elasticsearch já contém pastas com os binários e com as configurações):

# cd /opt/monitoring
# wget
https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.9.tar.gz
# tar -zxf elasticsearch-0.19.9.tar.gz
# mv elasticsearch-0.19.9 elasticsearch
# mkdir /opt/monitoring/elasticsearch/log
# rm /opt/monitoring/elasticsearch-0.19.9.tar.gz


Para facilitar o processo, vamos também criar um script para iniciar o Elasticsearch junto com o sistema (no caso, estamos usando o Ubuntu).

Para isso, crie um arquivo chamado "elasticsearch" na pasta /etc/init.d/, com o seguinte conteúdo:

 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          elasticsearch
 # Required-Start:    $all
 # Required-Stop:     $all
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Starts elasticsearch
 # Description:       Starts elasticsearch using start-stop-daemon
 ### END INIT INFO
  
 ES_HOME=/opt/monitoring/elasticsearch
 ES_MIN_MEM=256m
 ES_MAX_MEM=1g
 DAEMON=$ES_HOME/bin/elasticsearch
 NAME=elasticsearch
 DESC=elasticsearch
 PID_FILE=/var/run/$NAME.pid
 LOG_DIR=/opt/monitoring/$NAME/log
 DATA_DIR=/opt/monitoring/$NAME/data
 WORK_DIR=/tmp/$NAME
 CONFIG_FILE=/opt/monitoring/$NAME/config/elasticsearch.yml
 DAEMON_OPTS="-p $PID_FILE -Des.config=$CONFIG_FILE -Des.path.home=$ES_HOME -Des.path.logs=$LOG_DIR -Des.path.data=$DATA_DIR -Des.path.work=$WORK_DIR"


test -x $DAEMON || exit 0
  
set -e

case "$1" in
  start)
    echo -n "Starting $DESC: "
    mkdir -p $LOG_DIR $DATA_DIR $WORK_DIR
    if start-stop-daemon --start --pidfile $PID_FILE --startas $DAEMON -- $DAEMON_OPTS
    then
      echo "started."
    else
      echo "failed."
    fi
    ;;
  stop)
    echo -n "Stopping $DESC: "
    if start-stop-daemon --stop --pidfile $PID_FILE
    then
      echo "stopped."
    else
      echo "failed."
    fi
    ;;
  restart|force-reload)
    ${0} stop
    sleep 0.5
    ${0} start
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0


E instale o script:

# chmod +x /etc/init.d/elasticsearch
# update-rc.d elasticsearch defaults


Para este roteiro, as configurações disponíveis nos arquivos de configuração do Elasticsearch ("elasticsearch.yaml" e "logging.yaml") são o suficiente.

Para um ambiente de produção, pode ser necessário ajustar alguns parâmetros (Ex.: no caso de você pensar em usar um Cluster do Elasticsearch). Feito isso, inicie o Elasticsearch:

# /etc/init.d/elasticsearch start

Você pode acompanhar o startup do Elasticsearch através do log:

# tail -f /opt/monitoring/elasticsearch/log/elasticsearch.log

Agora, crie as pastas /opt/monitoring/redis/{bin,conf,log} para o Redis. Faça o download do código-fonte, disponível em:
Visite a página do Redis e verifique a versão mais recente. Descompacte o arquivo e compile o Redis:

# mkdir -p /opt/monitoring/redis/{conf,log,data}
# cd /opt/monitoring/redis
# wget
http://redis.googlecode.com/files/redis-2.4.17.tar.gz
# tar -zxf redis-2.4.17.tar.gz
# make


Depois de compilar, pode ser uma boa ideia testar os arquivos (para rodar o teste, é necessário ter instalado o pacote tcl8.5):

# make test

E depois disso, o make install, passando o caminho onde os binários do Redis serão instalados:

# make PREFIX=/opt/monitoring/redis/ install

Para inicializar o Redis junto com o sistema, você pode copiar o script de inicialização redis_init_script, disponível dentro da pasta "utils", para a pasta /etc/init.d, editando os caminhos corretamente.

Feito isso, copie o arquivo "redis.conf" para a pasta /opt/monitoring/redis/conf com o nome "6379.conf" e edite as seguintes linhas:

daemonize yes
logfile /opt/monitoring/redis/log/redis_6379.log
dir /opt/monitoring/redis/data


Feito isso, você pode inicializar o Redis:

# /etc/init.d/redis start

E acompanhar a operação através do log. Agora, você já pode iniciar as duas instâncias do Logstash, começando pelas máquinas que irão enviar as mensagens (shipper).

Na pasta onde está o binário do Logstash:

# java -jar logstash-1.1.1-monolithic.jar agent -f ../conf/shipper.conf

O Logstash já pode enviar mensagens ao Redis. Como ele está configurado para receber eventos da entrada padrão, vamos digitar algumas mensagens no console do Logstash. No servidor onde roda o Redis, execute o seu cliente:

# /opt/monitoring/redis/bin/redis-cli

No console do Redis-cli, execute o comando: llen logstash - para ver o tamanho da fila do Redis.

E o comando: lpop logstash - para recuperar mensagens da fila.

Agora, inicie o Logstash da máquina que vai indexar as mensagens (indexer):

# java -jar logstash-1.1.1-monolithic.jar agent -f ../conf/indexer.conf

O Logstash agora vai começar a ler as mensagens no Redis e enviar para o Elasticsearch. Digite algumas mensagens no console do Logstash da máquina shipper. Se quiser, pode verificar no console do redis-cli, que a mensagens estão sendo consumidas.

Entretanto, agora nós não estamos mais rodando o Logstash com sua interface Web. Para visualizar o conteúdo do Elasticsearch - e as mensagens coletadas pelo Logstash - vamos usar o Kibana.

O Kibana é uma interface gráfica para o Logstash (e Elasticsearch), com bem mais recursos que a interface embutida no Logstash.

Dependências

O Kibana é uma aplicação PHP, então é necessário um servidor Web e o PHP instalados na máquina. Nesse caso, iremos usar o Apache e o mod-php. Também é necessário o módulo cURL do PHP.

Eu usei os pacotes disponíveis no repositório do Ubuntu. O nome dos pacotes:
  • apache2
  • libapache2-mod-php5
  • php5-curl

Crie as pastas /opt/monitoring/kinaba/{www,log} e faça o download do Kibana, disponível em:
Visite a página do Kibana e verifique a versão mais recente. Descompacte e mova os arquivos para a pasta /opt/monitoring/kibana/www. Com o Apache já instalado, crie um arquivo de configuração similar ao abaixo:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /zunnit/kibana/www
    <Directory /zunnit/kibana/www>
         Options Indexes FollowSymLinks MultiViews
         AllowOverride None
         Order allow,deny
         allow from all
    </Directory>
    ErrorLog /zunnit/kibana/log/error.log
    LogLevel warn
    CustomLog /zunnit/kibana/log/access.log combined
</VirtualHost>


Também é necessário editar o arquivo de configuração do Kibana, o "config.php".

A princípio, a única opção que deve ser alterada é a "elasticsearch_server", que define o endereço e a porta do Elasticsearch. No nosso caso, o servidor é localhost e a porta é a padrão (9200).

Reinicie o Apache e aponte o browser para este servidor. A página inicial do Kibana será aberta. Clique no botão "Search" e veja as últimas mensagens que você digitou no console do Logstash Shipper.

Entretanto, coletar mensagens digitadas no console não é nada útil. Por isso, iremos configurar o Logstash para coletar alguma coisa mais interessante.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Ambiente distribuído
   3. Coletando e processando logs
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

SpiderOak - Armazenamento Grátis

Rust - Uma nova linguagem de programação

Linux, a pirataria de software e a desvalorização do desenvolvedor (parte 2)

Entendento o comando chmod

Guia de preparação para LPI

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts