web-dev-qa-db-fra.com

comment rediriger les journaux du menu fixe vers un fichier unique?

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

54
KETAN PATIL

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.

67
pl_rock

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.

80
Eddy Hernandez

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.
  • Il est probable que vous souhaitiez exécuter cette méthode en arrière-plan, d'où le &.
  • Vous pouvez séparer les sorties et stderr par: > output.log 2> error.log (au lieu d’utiliser &>).
11
juanmirocks

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.

4
Abhishek Galoda

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
2
Jean Velloen

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!

1
mirind4

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
0
Mugen

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

0
Anish Varghese