comment faire pour rediriger docker journaux pour un seul fichier?
Je veux rediriger tous les journaux de mon conteneur docker à un seul fichier de log à analyser. J'ai essayé
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
mais cela donne du journal dans deux fichiers différents. J'ai déjà essayé
docker logs container > /tmp/stdout.log
mais il ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Pas besoin de rediriger les logs.
Docker par défaut stocker les journaux dans un fichier journal. Pour vérifier le chemin du fichier journal exécuter la commande:
Ouvrir ce fichier journal et de les analyser.
si vous rediriger les journaux, alors vous n'obtiendrez que des journaux avant la redirection. vous ne serez pas en mesure de voir en direct les journaux.
EDIT:
À voir en direct les journaux que vous pouvez exécuter la commande ci-dessous
Remarque:
Ce fichier journal
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
sera créé que si le panneau générer des journaux, si il n'y a pas de journaux ensuite, ce fichier ne sera pas là. il est similaire, comme parfois, si nous commande exécuterdocker logs containername
et elle ne retourne rien. Dans ce scénario, ce fichier ne sera pas disponible.tail -f `docker inspect --format='{{.LogPath}}' myapp`
il est vraiment JSONComment sur cette option:
docker logs containername >& logs/myFile.log
Il ne sera pas rediriger les logs, qui a été demandé dans la question, mais de les copier en une fois à un fichier spécifique.
docker logs --help
pour être sûrdocker logs -f <yourContainer> &> your.log &
Explication:
-f
(c'est à dire--follow
): écrit tous les journaux existants et continue (suit) enregistrement de tout ce qui s'en vient.&>
redirige à la fois la sortie standard et l'erreur standard.&
.> output.log 2> error.log
(au lieu d'utiliser&>
).En supposant que vous avez de multiples récipients et vous souhaitez regrouper les journaux en un seul fichier, vous devez utiliser un journal des agrégateurs comme fluentd. fluentd est pris en charge, comme l'exploitation forestière pilote pour les conteneurs docker.
Donc dans docker-composer, vous devez définir l'enregistrement pilote
La deuxième étape serait de mettre à jour le fluentd conf pour accueillir les journaux de service 1 et service 2
Dans cette configuration, nous vous demandons de journaux à être écrites dans un fichier unique à ce chemin
/fluentd/log/service/service.*.log
et la troisième étape serait d'exécuter la mesure fluentd qui va commencer à écrire les logs dans le fichier.
Ici est la lien pour les instructions étape par étape
Peu Long, mais de manière correcte puisque vous obtenez plus de contrôle sur les fichiers journaux de chemin d'accès, etc et il fonctionne bien dans le Panneau de l'Essaim de trop .
Pour saisir à la fois la sortie standard & stderr à partir de votre panneau contenant un seul fichier journal exécutez la commande suivante:
Depuis le Panneau fusionne stdout et stderr pour nous, nous pouvons traiter la sortie du journal, comme n'importe quel autre shell flux. Pour rediriger les journaux en cours dans 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 vers stderr et stdout, de rediriger votre demande de sortie à un fichier et la carte de fichier pour le stockage permanent à l'extérieur du conteneur.
$ docker logs test_container> /tmp/output.log
Docker n'acceptera pas les chemins d'accès relatifs à la ligne de commande, donc si vous voulez utiliser un autre répertoire, vous devez utiliser le chemin d'accès complet.
Si vous travaillez sur Windows et utiliser PowerShell (comme moi), vous pouvez utiliser la ligne suivante à la capture de la
stdout
etstderr
:J'espère que cela aide quelqu'un!
Script Bash pour copier tous les conteneur des journaux vers un répertoire spécifié: