Je souhaite rediriger tous les journaux de mon conteneur Docker vers un seul fichier journal pour les analyser. j'ai essayé
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
mais cela donne un journal dans deux fichiers différents. J'ai déjà essayé
docker logs container > /tmp/stdout.log
mais cela n'a pas fonctionné.
Pas besoin de rediriger les journaux.
Docker stocke par défaut les journaux dans un fichier journal. Pour vérifier la commande d'exécution du chemin du fichier journal:
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
Ouvrez ce fichier journal et analysez-le.
si vous redirigez les journaux, vous ne les obtiendrez qu'avant la redirection. vous ne pourrez pas voir les journaux en direct.
MODIFIER:
Pour voir les journaux en direct, vous pouvez exécuter la commande ci-dessous
tail -f `docker inspect --format='{{.LogPath}}' containername`
Remarque:
Ce fichier journal /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
sera créé uniquement si le menu fixe génère des journaux s’il n’y en a pas, ce fichier n’y sera pas. c'est comme si parfois on exécutait la commande docker logs containername
sans rien renvoyer. Dans ce scénario, ce fichier ne sera pas disponible.
Que diriez-vous de cette option:
docker logs containername >& logs/myFile.log
Les journaux demandés dans la question ne seront pas redirigés, mais copiés une fois dans un fichier spécifique.
docker logs -f <yourContainer> &> your.log &
Explication:
-f
(i__e__--follow
): écrit tous les journaux existants et continue ( suit ) en enregistrant tout ce qui vient ensuite.&>
redirige à la fois la sortie standard et l'erreur standard.&
.> output.log 2> error.log
(au lieu d’utiliser &>
).En supposant que vous ayez plusieurs conteneurs et que vous souhaitiez agréger les journaux en un seul fichier, vous devez utiliser un agrégateur de journaux tel que fluentd. fluentd est pris en charge en tant que pilote de journalisation pour les conteneurs Docker.
Donc, dans docker-compose, vous devez définir le pilote de journalisation
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
La deuxième étape consisterait à mettre à jour la fluentd conf pour traiter les journaux des services 1 et 2.
<match service1>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</store>
</match>
<match service2>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%
</store>
</match>
Dans cette configuration, nous demandons que les journaux soient écrits dans un seul fichier sur ce chemin/fluentd/log/service/service.*.log
et la troisième étape serait d’exécuter le programme personnalisé fluentd qui commencera à écrire les journaux dans un fichier.
Voici le lien pour des instructions étape par étape
Peu de temps, mais de manière correcte puisque vous avez plus de contrôle sur le chemin des fichiers journaux, etc., et cela fonctionne également dans Docker Swarm.
Pour capturer stdout & stderr de votre conteneur de menu fixe dans un seul fichier journal, exécutez la procédure suivante:
docker logs container > container.log 2>&1
Si vous travaillez sous Windows et utilisez PowerShell (comme moi), vous pouvez utiliser la ligne suivante pour capturer le stdout
et stderr
:
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
J'espère que ça aide quelqu'un!
Script Bash pour copier tous les journaux de conteneur dans un répertoire spécifié:
#!/usr/bin/env bash
TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `Sudo docker ps --format '{{.Names}}'`;
do
path=$(Sudo docker inspect --format='{{.LogPath}}' $name)
Sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
Étant donné que Docker fusionne stdout et stderr pour nous, nous pouvons traiter la sortie du journal comme n'importe quel autre flux Shell. Pour rediriger les journaux actuels vers un fichier, utilisez un opérateur de redirection.
$ docker logs test_container > output.log
docker logs -f test_container > output.log
Au lieu d’envoyer la sortie à stderr et stdout, redirigez la sortie de votre application vers un fichier et mappez le fichier sur un stockage permanent en dehors du conteneur.
$ docker logs test_container> /tmp/output.log
Docker n'acceptera pas les chemins relatifs sur la ligne de commande. Par conséquent, si vous souhaitez utiliser un autre répertoire, vous devez utiliser le chemin complet.