Table des matières

Présentation

Logstash est un moteur de découpage de logs. Il est déjà riche de nombreux plugins et expressions régulières pour comprendre une très large variété de logs (system, apache, postfix, etc). Il est de plus très souple pour configurer les règles et tries des logs qu'on lui envoit.

Il supporte aussi très bien la mise à l'échelle, via des éventuelles clients pour pre-parser les logs, un gestionnaire de cache utilise redis, et une base de données modernes types noSQL elasticsearch.

Architecture simple

Un serveur central faisant aussi de collecteur de logs. Sur ce serveur logstash est configuré avec une entrée de type syslog sur le port 5000.

Les clients envoyent leurs logs via rsyslog.

Mise en oeuvre

Configuration des dépôts yum

Il y a un dépôt yum pour elasticsearch, et un pour logstash.

Fichier de configuration du dépôt pour elasticsearch dans /etc/yum.repos.d/elasticsearch.repo:

[elasticsearch-1.1]
name=Elasticsearch repository for 1.1.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

Fichier<font 13px/arial;;#000000;;#ffffff>de configuration du</font> dépôt<font 13px/arial;;#000000;;#ffffff>pour</font> elasticsearch<font 13px/arial;;#000000;;#ffffff></font> dans<font 13px/arial;;#000000;;#ffffff>/etc/yum.repos.d/elasticsearch.repo:</font>

[logstash-1.4]
name=logstash repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

Installation des paquets

L'installation de la base de données se fait avec la commande suivante:

yum install elasticsearch

​L'installation de logstash se fait avec la commande suivante:

yum install logstash

Configuration

# Ouverture en entrée d'un port d'écoute utilisant le protocol syslog
input {
  tcp {
    port => 5544 
    type => syslog 
  }
  udp {
    port => 5544 
    type => syslog 
  }
}

filter {
  # Traitement type syslog, le type étant marqué sur les données entrant par nos ports de type syslog
  if [type] == "syslog" {
    grok {
      # Si on ne veut pas garder le message non traité
      overwrite => "message"
        # rsyslong envoi des messages de type : <Numero>Ligne Syslog avec le message
      match => {
        "message" => [ "^(?:<%{NONNEGINT:syslog_pri}>)?%{SYSLOGBASE2} %{GREEDYDATA:message}", "^(?:<%{NONNEGINT:syslog_pri}>)(?:%{SYSLOGTIMESTAMP:timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) %{SYSLOGHOST:logsource} %{DATA:program}:%{GREEDYDATA:message}" ]
      }
      # on ajoute des tags perso, pratique pour filtrer dans l'interface kibana
      add_tag => [ "syslog", "grokked" ] 
    }
    # On ignore le champ syslog_pri
    syslog_pri { }

    # on crée une colonne hostip avec le contenu de la variable host
    mutate {
      add_field => [ "hostip", "%{host}" ] 
    }

    # on resoud l'ip présent dans la colonne host
    dns {
      reverse => [ "host" ] 
      action => "replace" 
    }
  }
}

# on stock dans elasticsearch
output {
  elasticsearch {
    host => "localhost" 
  }
}

Architecture avec broker

Le broker va servir de cache pour la reception des logs. Cela améliore les performances de logstash et permet d'éviter de perdre certains logs en cas de soucis. Mais le principal intérêt est de pouvoir utiliser l'agent logstash sur les clients pour envoyer des évènements qui ne seraient pas gérés par rsyslog.

En gros l'agent logstash envoi ces données préparsées dans la base du broker. Ensuite le logstash sur le collecteur lit régulièrement le broker pour voir si des évènements sont arrivés. Il les supprime du broker et les traite.

Logstash agent ⇒ Broker (sur collecteur) ⇐ logstash serveur

Il est possible d'utiliser “redis” comme broker en frontal de logstash.

Installation de redis

Le paquet redis est dispo dans le dépôt EPEL.

yum install redis

​Configuration de redis

Par défaut redis n'écoute que sur 127.0.0.1. Son fichier de configuration est /etc/redis.conf. Il faut changer la ligne bind 127.0.0.1.

Configuration du logstash agent

Logstash sur un noeud à monitorer est dit agent. En entrée il surveille des fichiers de logs (souvent non gérés par syslog), et en sortie envoi le résultat sur le logstash (ou broken) sur le collecteur.

Exemple de configuration pour parser un fichier de log puppet:

input {
  file {
    path => "/var/log/puppet/puppet.log"
    type => "puppet"
  }

filter {
  if [type] == "puppet" {
    # Ex: Tue Mar 25 18:07:07 +0100 2014 Puppet (notice): Finished catalog run in 51.85 seconds
    mutate { replace => { "type" => "puppet" } }
    grok {
      overwrite => "message"
      match => {
        "message" => "%{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{ISO8601_TIMEZONE} %{YEAR} %{DATA:puppet_module} \(%{DATA:puppet_loglevel}): %{GREEDYDATA:message}"
      }
      add_tag => [ "puppet", "grokked" ]
    }
  }

output {

}

Configuration du logstash collecteur

Le serveur logstash centralisant les logs a juste besoin d'une nouvelle entrée lui indiquant qu'il doit passer par un broker de type redis, en lui précisant son adresse:

CONF ICI