web-dev-qa-db-fra.com

Enregistrer les journaux de composition dans un fichier

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.

37
Ryan

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

43
Chris McKinnel

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.

18
creack

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
6
Larry Cai

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.)

2
Matthew Wilcoxson

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:

  • vous devez connaître le nom de votre conteneur, dans mon cas, c'est nginx-1 - J'utilise l'option docker-compose container_name: pour avoir cette constante
  • J'utilise tilitaire JQ pour analyser json - avec certaines options spéciales permettant d'obtenir le format identique à celui des fichiers journaux nginx d'origine.

Dans mon cas, le vidage des dernières lignes de 1 mio du journal nginx prend environ 10 secondes.

1
Robert Lujo