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

Configurer les pilotes de journalisation

Docker inclut plusieurs mécanismes de journalisation pour vous aider à obtenir des informations des conteneurs et services en cours d'exécution. Ces mécanismes sont appelés pilotes de journalisation. Chaque daemon Docker a un pilote de journalisation par défaut, que chaque conteneur utilise sauf si vous le configurez pour utiliser un pilote de journalisation différent, ou pilote de log en abrégé.

Par défaut, Docker utilise le pilote de journalisation json-file, qui met en cache les journaux de conteneur en JSON en interne. En plus d'utiliser les pilotes de journalisation inclus avec Docker, vous pouvez également implémenter et utiliser des plugins de pilote de journalisation.

Tip

Utilisez le pilote de journalisation local pour éviter l'épuisement du disque. Par défaut, aucune rotation de journal n'est effectuée. En conséquence, les fichiers journaux stockés par le pilote de journalisation json-file par défaut peuvent causer une utilisation importante d'espace disque pour les conteneurs qui génèrent beaucoup de sortie, ce qui peut mener à l'épuisement de l'espace disque.

Docker conserve le pilote de journalisation json-file (sans rotation de journal) par défaut pour rester rétrocompatible avec les anciennes versions de Docker, et pour les situations où Docker est utilisé comme runtime pour Kubernetes.

Pour les autres situations, le pilote de journalisation local est recommandé car il effectue la rotation de journal par défaut, et utilise un format de fichier plus efficace. Référez-vous à la section Configurer le pilote de journalisation par défaut ci-dessous pour apprendre comment configurer le pilote de journalisation local par défaut, et la page pilote de journalisation de fichier local pour plus de détails sur le pilote de journalisation local.

Configurer le pilote de journalisation par défaut

Pour configurer le daemon Docker pour qu'il utilise par défaut un pilote de journalisation spécifique, définissez la valeur de log-driver au nom du pilote de journalisation dans le fichier de configuration daemon.json. Référez-vous à la section "fichier de configuration du daemon" dans le manuel de référence dockerd pour plus de détails.

Le pilote de journalisation par défaut est json-file. L'exemple suivant définit le pilote de journalisation par défaut au pilote de log local :

{
  "log-driver": "local"
}

Si le pilote de journalisation a des options configurables, vous pouvez les définir dans le fichier daemon.json comme un objet JSON avec la clé log-opts. L'exemple suivant définit quatre options configurables sur le pilote de journalisation json-file :

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

Redémarrez Docker pour que les changements prennent effet pour les conteneurs nouvellement créés. Les conteneurs existants n'utilisent pas automatiquement la nouvelle configuration de journalisation.

Note

Les options de configuration log-opts dans le fichier de configuration daemon.json doivent être fournies sous forme de chaînes. Les valeurs booléennes et numériques (comme la valeur pour max-file dans l'exemple ci-dessus) doivent donc être entourées de guillemets (").

Si vous ne spécifiez pas un pilote de journalisation, la valeur par défaut est json-file. Pour trouver le pilote de journalisation par défaut actuel pour le daemon Docker, exécutez docker info et recherchez Logging Driver. Vous pouvez utiliser la commande suivante sur Linux, macOS ou PowerShell sur Windows :

$ docker info --format '{{.LoggingDriver}}'

json-file
Note

Changer le pilote de journalisation par défaut ou les options du pilote de journalisation dans la configuration du daemon affecte seulement les conteneurs qui sont créés après que la configuration soit changée. Les conteneurs existants conservent les options du pilote de journalisation qui ont été utilisées lorsqu'ils ont été créés. Pour mettre à jour le pilote de journalisation d'un conteneur, le conteneur doit être recréé avec les options désirées. Référez-vous à la section configurer le pilote de journalisation pour un conteneur ci-dessous pour apprendre comment trouver la configuration du pilote de journalisation d'un conteneur.

Configurer le pilote de journalisation pour un conteneur

Quand vous démarrez un conteneur, vous pouvez le configurer pour utiliser un pilote de journalisation différent de celui par défaut du daemon Docker, en utilisant le flag --log-driver. Si le pilote de journalisation a des options configurables, vous pouvez les définir en utilisant une ou plusieurs instances du flag --log-opt <n>=<VALUE>. Même si le conteneur utilise le pilote de journalisation par défaut, il peut utiliser différentes options configurables.

L'exemple suivant démarre un conteneur Alpine avec le pilote de journalisation none.

$ docker run -it --log-driver none alpine ash

Pour trouver le pilote de journalisation actuel d'un conteneur en cours d'exécution, si le daemon utilise le pilote de journalisation json-file, exécutez la commande docker inspect suivante, en substituant le nom ou l'ID du conteneur pour <CONTAINER> :

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

json-file

Configurer le mode de livraison des messages de journal du conteneur au pilote de journal

Docker fournit deux modes pour livrer les messages du conteneur au pilote de journal :

  • (par défaut) livraison directe et bloquante du conteneur au pilote
  • livraison non bloquante qui stocke les messages de journal dans un tampon intermédiaire par conteneur pour consommation par le pilote

Le mode de livraison de message non-blocking empêche les applications de se bloquer à cause de la contre-pression de journalisation. Les applications sont susceptibles d'échouer de manières inattendues quand les flux STDERR ou STDOUT se bloquent.

Warning

Quand le tampon est plein, les nouveaux messages ne seront pas mis en file d'attente. Abandonner les messages est souvent préférable à bloquer le processus d'écriture de journal d'une application.

L'option de journal mode contrôle s'il faut utiliser la livraison de message blocking (par défaut) ou non-blocking.

Le max-buffer-size contrôle la taille du tampon utilisé pour le stockage intermédiaire de message quand mode est défini à non-blocking. La valeur par défaut est 1m signifiant 1 MB (1 million d'octets). Voir fonction FromHumanSize() dans le paquet go-units pour les chaînes de format autorisées, quelques exemples sont 1KiB pour 1024 octets, 2g pour 2 milliards d'octets.

L'exemple suivant démarre un conteneur Alpine avec la sortie de journal en mode non bloquant et un tampon de 4 mégaoctets :

$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1

Utiliser des variables d'environnement ou des étiquettes avec les pilotes de journalisation

Certains pilotes de journalisation ajoutent la valeur des flags --env|-e ou --label d'un conteneur aux journaux du conteneur. Cet exemple démarre un conteneur en utilisant le pilote de journalisation par défaut du daemon Docker (dans l'exemple suivant, json-file) mais définit la variable d'environnement os=ubuntu.

$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh

Si le pilote de journalisation le supporte, cela ajoute des champs supplémentaires à la sortie de journalisation. La sortie suivante est générée par le pilote de journalisation json-file :

"attrs":{"production_status":"testing","os":"ubuntu"}

Pilotes de journalisation supportés

Les pilotes de journalisation suivants sont supportés. Voir le lien vers la documentation de chaque pilote pour ses options configurables, le cas échéant. Si vous utilisez des plugins de pilote de journalisation, vous pourriez voir plus d'options.

Pilote Description
none Aucun journal n'est disponible pour le conteneur et docker logs ne retourne aucune sortie.
local Les journaux sont stockés dans un format personnalisé conçu pour une surcharge minimale.
json-file Les journaux sont formatés en JSON. Le pilote de journalisation par défaut pour Docker.
syslog Écrit les messages de journalisation vers la facilité syslog. Le daemon syslog doit être en cours d'exécution sur la machine hôte.
journald Écrit les messages de journal vers journald. Le daemon journald doit être en cours d'exécution sur la machine hôte.
gelf Écrit les messages de journal vers un point de terminaison Graylog Extended Log Format (GELF) tel que Graylog ou Logstash.
fluentd Écrit les messages de journal vers fluentd (entrée forward). Le daemon fluentd doit être en cours d'exécution sur la machine hôte.
awslogs Écrit les messages de journal vers Amazon CloudWatch Logs.
splunk Écrit les messages de journal vers splunk en utilisant le HTTP Event Collector.
etwlogs Écrit les messages de journal comme événements Event Tracing for Windows (ETW). Disponible seulement sur les plateformes Windows.
gcplogs Écrit les messages de journal vers Google Cloud Platform (GCP) Logging.

Limitations des pilotes de journalisation

  • Lire les informations de journal nécessite de décompresser les fichiers journaux en rotation, ce qui cause une augmentation temporaire de l'utilisation du disque (jusqu'à ce que les entrées de journal des fichiers en rotation soient lues) et une augmentation de l'utilisation du CPU pendant la décompression.
  • La capacité du stockage hôte où réside le répertoire de données Docker détermine la taille maximale des informations de fichier journal.