J'utilise docker logs [container-name]
pour voir les journaux d'un conteneur spécifique.
Existe-t-il un moyen élégant d'effacer ces journaux ?
J'utilise docker logs [container-name]
pour voir les journaux d'un conteneur spécifique.
Existe-t-il un moyen élégant d'effacer ces journaux ?
D'abord la mauvaise réponse. De cette question il y a une ligne simple que vous pouvez exécuter :
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
au lieu de l'écho, il y a le plus simple :
: > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
ou il y a la commande truncate :
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Je ne suis pas un grand fan de ces deux solutions, car elles modifient directement les fichiers de Docker. La suppression du journal externe pourrait se produire pendant que Docker écrit des données au format json dans le fichier, ce qui entraînerait une ligne partielle et empêcherait la lecture de tous les journaux à partir du fichier docker logs
cli. Pour un exemple de ce qui se passe, voir ce commentaire sur la réponse de duketwo :
après avoir vidé le fichier journal, j'obtiens cette erreur :
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Au lieu de cela, vous pouvez demander à Docker de faire tourner automatiquement les journaux pour vous. Ceci est fait avec des drapeaux supplémentaires à dockerd si vous utilisez l'option par défaut Pilote de journalisation JSON :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Vous pouvez également définir ce paramètre dans le cadre de votre daemon.json au lieu de modifier vos scripts de démarrage :
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Ces options doivent être configurées avec un accès Root. Assurez-vous d'exécuter un systemctl reload docker
après avoir modifié ce fichier pour que les paramètres soient appliqués. Ce paramètre sera alors la valeur par défaut pour tous les conteneurs nouvellement créés. Notez que les conteneurs existants doivent être supprimés et recréés pour recevoir les nouvelles limites de journal.
Des options de journalisation similaires peuvent être passées aux conteneurs individuels pour remplacer ces valeurs par défaut, ce qui vous permet d'enregistrer plus ou moins de journaux sur les conteneurs individuels. À partir de docker run
ça ressemble à ça :
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
ou dans un fichier de composition :
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Pour gagner encore plus d'espace, vous pouvez passer du pilote de journal json au pilote de journal "local". Il utilise les mêmes options max-size et max-file, mais au lieu de stocker en json, il utilise une syntaxe binaire qui est plus rapide et plus petite. Cela vous permet de stocker plus de journaux dans un fichier de même taille. L'entrée daemon.json pour cela ressemble à ceci :
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
L'inconvénient du pilote local est que les analyseurs/transfert de journaux externes qui dépendaient d'un accès direct aux journaux json ne fonctionneront plus. Donc si vous utilisez un outil comme filebeat pour envoyer vers Elastic, ou le forwarder universel de Splunk, j'éviterais le pilote "local".
J'en ai un peu plus à ce sujet dans mon Présentation des conseils et astuces .
J'ai fait un service docker restart
qui, à lui seul, n'a pas fonctionné. Il fallait également créer de nouveaux conteneurs avant que cela ne prenne effet, c'est-à-dire que le simple fait de faire apparaître les anciens conteneurs n'appliquait pas la nouvelle journalisation.
J'utilise Docker 1.13.1, et la commande 'docker inspect --format='{{.LogPath}}' <container id>' renvoie une chaîne de caractères nulle ("").... mais j'obtiens toujours la sortie de 'docker logs <container id>' !? D'où cela vient-il et comment puis-je le supprimer ?
@JDAllen La version 1.13.1 n'est plus supportée depuis longtemps. Je ne dispose pas d'un système aussi ancien pour visualiser leurs résultats d'inspection.
Utilisez :
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Vous pouvez avoir besoin de sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
réf. Jeff S. Comment effacer correctement les journaux pour un conteneur Docker ?
Référence : Tronquer un fichier en cours d'utilisation (Linux)
Truncate : cannot open '/var/lib/docker/containers/*/*-json.log' for writing : Aucun fichier ou répertoire de ce type
@BTRNaidu vous devez l'exécuter en tant que Root/sudo, le contenu du fichier containers
n'est pas disponible autrement.
Pour obtenir la taille des journaux sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
pour n'obtenir que le total de la taille des journaux. sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Y a-t-il des problèmes avec dockerd/aufs qui ignorent et sont incapables de supprimer les fichiers journaux tournés ?
Et comment puis-je l'utiliser ? il est utilisé par défaut avec docker run
? dossier /etc/logrotate.d/docker-logs
n'existe pas, je dois le créer ?
Vous devez appeler l'utilitaire logrotate (logrotate <config-file> ) et il lira votre configuration et exécutera le nettoyage. Vous pouvez également le configurer comme une tâche cron par exemple.
Le problème avec celle-ci est qu'elle peut ne pas être correctement synchronisée avec ce que fait docker. Il est probablement plus sage d'utiliser l'installation de Docker. (le "log-opts"
comme indiqué par BMitch)
Vous ne pouvez pas le faire directement par le biais d'une commande Docker.
Vous pouvez soit limiter la taille du journal, soit utiliser un script pour supprimer les journaux liés à un conteneur. Vous pouvez trouver des exemples de scripts ici (lire à partir du bas) : Fonctionnement : Possibilité d'effacer l'historique des logs #1083
Consultez le section d'enregistrement de la référence du fichier docker-compose, où vous pouvez spécifier des options (telles que la rotation du journal et la taille limite du journal) pour certains pilotes de journalisation.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
53 votes
Sur une note complémentaire, vous pouvez obtenir la taille des journaux via
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
4 votes
Il ne s'agit pas exactement d'effacer les journaux, mais pour éviter de voir les anciens journaux, vous pouvez utiliser "-n" et l'option "-f". -n : Nombre de lignes à afficher à partir de la fin des logs (par défaut "all") -f : Suivre la sortie du journal $ docker logs -n 0 -f [nom-du-conteneur] Ceci vous montrera uniquement les journaux entrants.