⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Pilote de logging Journald

Le pilote de logging journald envoie les logs de conteneur au journal systemd. Les entrées de log peuvent être récupérées en utilisant la commande journalctl, via l'utilisation de l' API journal, ou en utilisant la commande docker logs.

En plus du texte du message de log lui-même, le pilote de log journald stocke les métadonnées suivantes dans le journal avec chaque message :

Champ Description
CONTAINER_ID L'ID du conteneur tronqué à 12 caractères.
CONTAINER_ID_FULL L'ID complet du conteneur de 64 caractères.
CONTAINER_NAME Le nom du conteneur au moment où il a été démarré. Si vous utilisez docker rename pour renommer un conteneur, le nouveau nom n'est pas reflété dans les entrées du journal.
CONTAINER_TAG, SYSLOG_IDENTIFIER Le tag de conteneur (documentation des options de tag de log).
CONTAINER_PARTIAL_MESSAGE Un champ qui signale l'intégrité du log. Améliore le logging des longues lignes de log.
IMAGE_NAME Le nom de l'image du conteneur.

Utilisation

Pour utiliser le pilote journald comme pilote de logging par défaut, définissez les clés log-driver et log-opts aux valeurs appropriées dans le fichier daemon.json, qui se trouve dans /etc/docker/ sur les hôtes Linux ou C:\ProgramData\docker\config\daemon.json sur Windows Server. Pour plus d'informations sur la configuration de Docker en utilisant daemon.json, voir daemon.json.

L'exemple suivant définit le pilote de log à journald :

{
  "log-driver": "journald"
}

Redémarrez Docker pour que les changements prennent effet.

Pour configurer le pilote de logging pour un conteneur spécifique, utilisez le drapeau --log-driver avec la commande docker run.

$ docker run --log-driver=journald ...

Options

Utilisez le drapeau --log-opt NAME=VALUE pour spécifier des options supplémentaires du pilote de logging journald.

Option Requis Description
tag optionnel Spécifie un modèle pour définir la valeur CONTAINER_TAG et SYSLOG_IDENTIFIER dans les logs journald. Référez-vous à la documentation des options de tag de log pour personnaliser le format de tag de log.
labels optionnel Liste séparée par des virgules de clés d'étiquettes, qui devraient être incluses dans le message, si ces étiquettes sont spécifiées pour le conteneur.
labels-regex optionnel Similaire et compatible avec labels. Une expression régulière pour correspondre aux étiquettes liées au logging. Utilisé pour les options avancées de tag de log.
env optionnel Liste séparée par des virgules de clés de variables d'environnement, qui devraient être incluses dans le message, si ces variables sont spécifiées pour le conteneur.
env-regex optionnel Similaire et compatible avec env. Une expression régulière pour correspondre aux variables d'environnement liées au logging. Utilisé pour les options avancées de tag de log.

Si une collision se produit entre les options label et env, la valeur de env prend la précédence. Chaque option ajoute des champs supplémentaires aux attributs d'un message de logging.

Ce qui suit est un exemple des options de logging requises pour logger vers journald.

$ docker run \
    --log-driver=journald \
    --log-opt labels=location \
    --log-opt env=TEST \
    --env "TEST=false" \
    --label location=west \
    your/application

Cette configuration dirige aussi le pilote à inclure dans la charge utile l'étiquette location, et la variable d'environnement TEST. Si les arguments --env "TEST=false" ou --label location=west étaient omis, la clé correspondante ne serait pas définie dans le log journald.

Note concernant les noms de conteneur

La valeur loggée dans le champ CONTAINER_NAME est le nom du conteneur qui a été défini au démarrage. Si vous utilisez docker rename pour renommer un conteneur, le nouveau nom n'est pas reflété dans les entrées du journal. Les entrées du journal continuent à utiliser le nom original.

Récupérer les messages de log avec journalctl

Utilisez la commande journalctl pour récupérer les messages de log. Vous pouvez appliquer des expressions de filtre pour limiter les messages récupérés à ceux associés à un conteneur spécifique :

$ sudo journalctl CONTAINER_NAME=webserver

Vous pouvez utiliser des filtres supplémentaires pour limiter davantage les messages récupérés. Le drapeau -b ne récupère que les messages générés depuis le dernier démarrage du système :

$ sudo journalctl -b CONTAINER_NAME=webserver

Le drapeau -o spécifie le format pour les messages de log récupérés. Utilisez -o json pour retourner les messages de log au format JSON.

$ sudo journalctl -o json CONTAINER_NAME=webserver

Visualiser les logs pour un conteneur avec TTY activé

Si TTY est activé sur un conteneur vous pourriez voir [10B blob data] dans la sortie lors de la récupération des messages de log. La raison pour cela est que \r est ajouté à la fin de la ligne et journalctl ne le supprime pas automatiquement sauf si --all est défini :

$ sudo journalctl -b CONTAINER_NAME=webserver --all

Récupérer les messages de log avec l'API journal

Cet exemple utilise le module Python systemd pour récupérer les logs de conteneur :

import systemd.journal

reader = systemd.journal.Reader()
reader.add_match('CONTAINER_NAME=web')

for msg in reader:
    print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)