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)