Docker(ELK+Filebeat) -> pas de log


(Gil Felot) #1

Bonjour à tous,

Je débute avec la stack elastic, je ne suis d'ailleurs qu'en stagiaire, donc étudiant.

Je dois être à l'aise avec ces outils en vu ensuite de faire des mini projets pour que je puisse ensuite les utiliser sur des cas clients.

J'ai décidé de commencer par afficher mes log /var/log/syslog et /var/log/auth.log et ensuite prendre en main kibana pour affiner mes recherches.

J'ai egalement voulu "dockeriser" mes services. Le tout est sur une seule et même machine

J'ai donc pris cette base : https://github.com/deviantony/docker-elk

Sur laquelle j'ai rajouter le container prima/filebeat.
https://hub.docker.com/r/prima/filebeat/

Avec Sense j'observe que je n'ai aucun log d'indexé dans ES.

Mes fichiers de conf

docker-compose.yml:

elasticsearch:
  image: elasticsearch:latest
  command: elasticsearch -Des.network.host=0.0.0.0
  ports:
    - "9200:9200"
    - "9300:9300"
logstash:
  image: logstash:latest
  command: logstash -f /etc/logstash/conf.d/logstash.conf
  volumes:
    - ./logstash/config:/etc/logstash/conf.d
  ports:
    - "5000:5000"
  links:
    - elasticsearch
kibana:
  build: kibana/
  volumes:
    - ./kibana/config/kibana.yml:/opt/kibana/config/kibana.yml
  ports:
    - "5601:5601"
  links:
    - elasticsearch

logstash.conf:

input {
        beats {
                port => 5000
                type => "logs"
        }
}

filter {
        if [type] == "syslog" {
                grok {
                        match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
                        add_field => [ "received_at", "%{@timestamp}" ]
                        add_field => [ "received_from", "%{host}" ]
                }
                syslog_pri { }
                date {
                        match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
                }
        }
}

output {
        elasticsearch {
                hosts => "elasticsearch:9200"
        }
}

filebeate.yml

filebeat:
  # List of prospectors to fetch data.
  prospectors:
    # Each - is a prospector. Below are the prospector specific configurations
    -
      # Paths that should be crawled and fetched. Glob based paths.
      # For each file found under this path, a harvester is started.
      paths:
        - "/var/log/*.log"
        - "/var/log/syslog"
      # - c:\programdata\elasticsearch\logs\*

      # Type of the files. Based on this the way the file is read is decided.
      # The different types cannot be mixed in one prospector
      #
      # Possible options are:
      # * log: Reads every line of the log file (default)
      # * stdin: Reads the standard in
      input_type: log

      document_type: syslog

output:
  logstash:
    hosts:["localhost:5000"]

Avez-vous une idée d'ou ça coince car je ne sais pas comment débuguer ça ?
Les fichiers me semblent correctement configurés.

Merci.


(Gil Felot) #2

J'ai trouvé un partie de la réponse.

docker ps -a me montre que filebeat exit juste après le lancement.
Donc normal que je n'ai rien a indexer.

Je continue a chercher de se côté la.


(Gil Felot) #3

J'avance dans mon debug.

Pour avoir filebeat qui redirige les logs vers stdout il faut le flag -e.

Ensuite avec docker logs <containerName>je peux lire la sortie d'erreur.

J'obtiens ce résultat :

Loading config file error: Failed to read /etc/filebeat/filebeat.yml: read /etc/filebeat/filebeat.yml: is a directory. Exiting.

Comment /etc/filebeat/filebeat.yml peut être un dossier ? C'est le chemin de conf expliqué dans la doc ???

Je lance mon container avec cette commande, depuis l'endrois ou j'ai en dur mon fichier .yml de conf

sudo docker run -d -v filebeat.yml:/etc/filebeat/filebeat.yml --name filebeat prima/filebeat -e


(David Pilato) #4

Je ne connais pas Docker pour commenter suffisamment mais es-tu sûr que l'option que tu passes est la bonne ?

Peut-être devrais-tu "monter" le répertoire" . vers /etc/filebeat/?


(Gil Felot) #5

Merci David,

Alors non le charactère '.' n'est pas pris en compte pour indiquer le répertoire courant.
J'ai volontairement raccourci le chemin absolu pour plus de visibilité. J'ai oublié de le mentionner pardon.

J'ai trouvé mon erreur principale.

les fichiers YML sont comme le language python sensible a l'indentation et aux espaces.

donc dans le fichier de conf filebeat en lieu et place de :

output:
  logstash:
    hosts:["localhost:5000"]

Il fallait :

output:
  logstash:
    hosts: ["localhost:5000"]

Tous mes services tournent bien correctement dans leurs env.

Pourtant je ne reçoit toujours pas de data.

Même avec un nc localhost 5000 < /var/log/syslog


(system) #6