Comment rediriger les journaux d'application des conteneurs Docker dans ELK

J'essaie de centraliser la journalisation dans un média en utilisant plusieurs technologies appliquées. (Java, Rails et différentes bases de données).

Nous voulons que les développeurs créent des piles avec Docker Compose, Mais nous voulons qu'ils font appel à la source centrale des magazines (ELK) Pour les problèmes de débogage et n'a pas essayé d'ouvrir les obus pour exécuter des conteneurs Docker.

Toutes les applications écrivent des données sur le système de fichiers et non dans STDOUT / STDERR, Qui supprime tous les paramètres associés au pilote de journal Docker, et logspout.

Ce que nous avons fait a été configuré des conteneurs afin que rsyslog fichiers journaux d'application inclus et les redirigé vers logstash, qui a une entrée syslog. Cela fonctionne en termes de déplacement des journaux de A dans B, Mais gestion de magazines avec plusieurs technologies dans ELK Basé sur les données d'entrée syslog terriblement (Par exemple, une tentative de capture de la pile de traces multi-lignes Java ou demandes lentes MySQL).

Y a-t-il une meilleure façon de le faire? Devrais-je courir logstash Dans chaque conteneur, de sorte que je puisse utiliser des filtres et des codecs directement pour enregistrer des fichiers afin de ne pas avoir à compter sur l'entrée du journal du système?

Y a-t-il un moyen d'utiliser un pilote de journal Docker Avec les fichiers journaux d'application qui sont écrits dans le système de fichiers?
Invité:

Babette

Confirmation de:

Dernières versions Docker Supporte la connexion au format GELF sur le port de réseau. Logstash a une entrée GELF. Tu peux courir Logstash sur chaque nœud et envoyer toutes les copies dessus Docker sur le nœud.

Comme entrée Logstash:
https://www.elastic.co/guide/e ... .html
gelf {
}

Pour la sortie Docker:
https://docs.docker.com/engine ... 3gelf
$ docker run -dit \
--log-driver=gelf \
--log-opt gelf-address=udp://127.0.0.1:12201 \
alpine sh

(L'adresse de la goules est située à l'extérieur du conteneur et non à l'intérieur)

Giselle

Confirmation de:

Vous pouvez également configurer logstash Pour analyser divers
https://docs.docker.com/engine ... -file
Docker émet la valeur par défaut.

Une autre approche - utiliser quoi Kubernetes appelé sidecar.

Ils dirigent plusieurs exemples différents dans leur
https://kubernetes.io/docs/con ... ging/
Concept page.

La façon dont vous décidez d'appliquer ce concept dépend complètement de vos besoins.

Cependant, la simple preuve du concept peut fonctionner:

Création d'un fichier d'accompagnement logstash, qui reçoit des journaux du système entrant (Par exemple, utilise l'entrée du journal du système)

Définir tous les conteneurs pour utiliser des quais
https://docs.docker.com/engine ... yslog
Envoyez un magazine à la poussette.

Vous pouvez également, bien sûr, configurer l'auditeur central du journal système. (Par exemple, en utilisant logstash ou rsyslog) Et faites-le sans un élément concomitant.

Cette approche est également très similaire à @
https://serverfault.com/users/232216/jason-martin
User de l'offre GELF.

Une autre option d'utilisation d'un fichier d'accompagnement local peut consister à créer un conteneur dans lequel il est effectué. logstash de
https://www.elastic.co/guide/e ... .html
, et fourni ce magazine (par exemple, / var / log / ou / logs). Ensuite, vous pouvez partager ce volume avec d'autres conteneurs afin qu'ils puissent écrire leurs magazines. (par exemple, /logs/$INSTANCE_ID/file.log), et logstash Ils ont été analysés.

Ce dernier paramètre vous permet de suivre les fichiers, pas STDOUT / STDERR, Mais vous avez probablement besoin d'un répertoire de journal.

chmod 1777

(ou avoir plusieurs nouvelles poussettes).

Le mode "inverse", bien sûr, fonctionnera également (Mais il semble qu'il soit plus difficile de gérer / Support): Laissez les conteneurs des applications présentent le magazine et la transaction concomitante logstash Lit le contenu du volume de journal.

Pour répondre aux questions, connectez-vous ou registre