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.
TipUtilisez 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 journalisationjson-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 journalisationlocal
par défaut, et la page pilote de journalisation de fichier local pour plus de détails sur le pilote de journalisationlocal
.
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.
NoteLes options de configuration
log-opts
dans le fichier de configurationdaemon.json
doivent être fournies sous forme de chaînes. Les valeurs booléennes et numériques (comme la valeur pourmax-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
NoteChanger 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.
WarningQuand 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.