J'ai des tests unitaires en cours d'exécution sur mon serveur de build et j'aimerais capturer les résultats du journal pour les analyser en cas d'échec. Je n'ai pas encore trouvé le moyen de rediriger la sortie de docker-compose logs
dans un fichier, ou pour rechercher l'emplacement réel des fichiers journaux eux-mêmes.
Je veux l'équivalent de:
docker-compose logs > logs.txt
Edit - clarification:
Tous mes conteneurs Docker produisent des journaux utiles, qu’une exécution manuelle de docker-compose logs
révèle. Je souhaite utiliser ce processus pour enregistrer ces mêmes journaux dans un fichier qui est un artefact sur mon serveur de génération. Essentiellement, le résultat de docker-compose logs
enregistré dans un fichier, cependant docker-compose logs
ne quitte jamais.
Le docker utilise par défaut le json-file
Le pilote pour enregistrer les journaux de vos conteneurs et la sortie brute des journaux json se trouve dans:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
Vous pouvez obtenir cet emplacement en lançant:
docker inspect --format='{{.LogPath}}' [container-id or container-name]
Quand vous courez docker-compose logs [service-name]
, docker-compose
attachera au service (conteneur) que vous référencez et l'objet LogPrinter affichera le contenu du fichier ci-dessus, mais formaté pour en faciliter la lecture.
Documents liés: https://docs.docker.com/compose/compose-file/#logging
Je ne suis pas sûr de ce que vous essayez de réaliser. Essayez-vous de reproduire
docker-compose logs > logs.txt
dans le fichier de composition comme une instruction? Ou votre problème est-il que la redirection ne "capture" pas la totalité de la sortie?
Dans la suite, vous pouvez faire:
docker-compose logs --no-color >& logs.txt
Ou
docker-compose logs --no-color |& tee logs.txt
voir à la fois les journaux sur le terminal et le vider dans un fichier en même temps.
Dans la version ultérieure docker-compose 1.7.x +, il est corrigé. voir https://github.com/docker/compose/issues/2227 & https://github.com/docker/compose/releases/tag/1.7.
Avant cela, il existe un autre moyen de le réaliser, la solution de réponse acceptée consiste à accéder directement aux fichiers de l'hôte, ce qui peut ne pas être applicable aux cas de sécurité/à distance.
Ci-dessous, nous pouvons obtenir le nom du conteneur de docker-compose ps
commande et laisse le docker logs
commande à boucler
docker-compose ps | tail -n +3 | awk '{print $1}' | xargs -n1 docker logs
Le docker-compose logs
commande ne termine (sauf si vous ajoutez le --follow
réglage).
Le problème probable ici est que les journaux sont si gros que leur formatage et leur sortie prennent un certain temps. Vous pouvez réduire ce problème si vous limitez le nombre de sorties en spécifiant le nombre de lignes à lire et le conteneur à partir duquel vous souhaitez lire.
Essayer:
docker-compose logs --no-color --tail=1000 CONTAINER_NAME > logs.txt
(Ajustez le numéro de queue selon vos besoins. J'ai ajouté "--no-color" pour simplifier la sortie, mais ce n'est pas nécessaire.)
La solution que j'ai proposée est basée sur la réponse de Chris McKinnel avec quelques améliorations.
Je devais vider les derniers enregistrements 1MIO de mon conteneur nginx et docker-compose logs --tail 1000000 nginx > last1mio.log
était trop lent et la sortie n’était pas exactement la même chose que les fichiers nginx habituels.
C'est une solution qui fonctionne pour moi:
docker inspect --format='{{.LogPath}}' nginx-1 \
| xargs tail -n 1000000 \
| jq -r -j .log > last1mio.log 2>&1
Remarques:
nginx-1
- J'utilise l'option docker-compose container_name:
pour avoir cette constanteDans mon cas, le vidage des dernières lignes de 1 mio du journal nginx prend environ 10 secondes.