Estoy interesado en hacer una centralización de logs para facilitar el análisis de los problemas de infraestructura, monitorear y mantener un histórico de servicio.

Para entender lo básico de logstash me puse un servidor pequeño para hacer pruebas, inicialmente con los logs de apache.

Dado que no tengo $$$$ para pagar algo con soporte y todas las utilidades, usaré todas las versiones oss (Open Source Software) de estos productos:

  • Apache HTTP Server: A descargar según distribución
  • Logstash: Centraliza los logs | Descargar Logstash
  • Filebeat: Envía la información de archivos (logs) a Elastic Search | Descargar Filebeat
  • ElasticSearch: Guarda la información obtenida de los logs | Descargar ElasticSearch
  • Grok: Filtra el log de apache y lo convierte en campos con nombre, al estilo JSON | Plugin ya incluido con Elastice
  • Kibana: Visualiza y permite jugar con los datos en vez de hacer queries por CURL | Descargar Kibana

Orden de instalación y configuración

Asumiendo que ya tenemos algún sitio publicado en el apache usaremos alguno de los logs generados por default. En mi distro usaré:

/var/log/apache2/access.log

Instalamos Logstash:

#dpkg -i logstash-oss.deb
Selecting previously unselected package logstash-oss.
(Reading database ... 54254 files and directories currently installed.)
Preparing to unpack logstash-oss-7.3.1.deb ...
Unpacking logstash-oss (1:7.3.1-1) ...
Setting up logstash-oss (1:7.3.1-1) ...
Using provided startup.options file: /etc/logstash/startup.options
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated
Successfully created system startup script for Logstash
root@myserver:~#

Configuramos logstash /etc/logstash/conf.d/logstash.conf 

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
  beats {
        port => "5044"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "apache-myproject-%{+YYYY.MM.dd}"
  }
}

Instalamos Filebeat

dpkg -i filebeat-oss.deb

Configuramos filebeat /etc/filebeat/filebeat.yml 

filebeat.inputs:
- type: log
  paths:
    - /var/log/apache2/access.log
output.logstash:
  hosts: ["localhost:5044"]

Instalamos Elastic Search

root@myserver:~# dpkg -i elasticsearch-oss-7.3.1-amd64.deb 
Selecting previously unselected package elasticsearch-oss.
(Reading database ... 70128 files and directories currently installed.)
Preparing to unpack elasticsearch-oss-7.3.1-amd64.deb ...
Unpacking elasticsearch-oss (7.3.1) ...
Setting up elasticsearch-oss (7.3.1) ...
Installing new version of config file /etc/elasticsearch/elasticsearch.yml ...
Installing new version of config file /etc/elasticsearch/jvm.options ...
Installing new version of config file /etc/elasticsearch/log4j2.properties ...
Installing new version of config file /etc/default/elasticsearch ...
Installing new version of config file /etc/init.d/elasticsearch ...
Created elasticsearch keystore in /etc/elasticsearch
Processing triggers for systemd (232-25+deb9u4) ...

Instalamos Kibana

dpkg -i kibana-oss.deb

Configuramos Kibana para acceder desde cualquier equipo /etc/kibana/kibana.yml

# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: "0.0.0.0"

Iniciar los servicios

# En Debian
service kibana start
service elasticsearch start

# Iniciamos la exploración del log con filebeat
/usr/share/filebeat/bin/filebeat -e -c filebeat.yml -d "publish"
# Iniciamos el pipeline de logstash para que reciba los datos y se los pase a Elastic
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --config.reload.automatic

Finalmente cuando ingresemos en la URL de Kibana podremos agregar el filtro:

apache-myproject-<DATE>

Como configuramos previamente. De esta forma en Kibana aparece cada parte del log con un nombre de campo al que se le pueden aplicar queries fácilmente: