¿Cómo redirigir los registros del contenedor de Docker a un solo archivo?

110

Quiero redirigir todos los registros de mi contenedor Docker a un solo archivo de registro para analizarlos. Lo intenté

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

pero esto da registro en dos archivos diferentes. Ya lo intenté

docker logs container > /tmp/stdout.log

Pero no funcionó.

PATIL KETAN
fuente

Respuestas:

137

No es necesario redirigir los registros.

Docker almacena los registros de forma predeterminada en un archivo de registro. Para comprobar la ruta del archivo de registro ejecutar el comando:

docker inspect --format='{{.LogPath}}' containername

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

Abra ese archivo de registro y analícelo.

si redirige los registros, solo obtendrá registros antes de la redirección. no podrá ver los registros en vivo.

EDITAR:

Para ver los registros en vivo, puede ejecutar el siguiente comando

tail -f `docker inspect --format='{{.LogPath}}' containername`

Nota:

Este archivo de registro /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.logse creará solo si la ventana acoplable genera registros, si no hay registros, este archivo no estará allí. es similar a cuando ejecutamos el comando docker logs containernamey no devuelve nada. En ese escenario, este archivo no estará disponible.

pl_rock
fuente
tail -f `docker inspect --format='{{.LogPath}}' myapp`- realmente es JSON
Adam
fallará si ese archivo no está allí. significa que si Docker no genera ningún registro, este archivo no se creará. pero si Docker genera registros, este comando es bueno para ver registros en vivo. gracias Adam. agregándolo a mi respuesta para ayudar a otros.
pl_rock
"Docker almacena los registros de forma predeterminada en un archivo de registro". - ¿en que contexto? ¿Todos los contenedores que se ejecutan en un host de Docker obtienen salida en un solo archivo? ¿Un solo contenedor?
Chris Stryczynski
@ChrisStryczynski Docker crea un archivo de registro por contenedor
Eddy Hernandez
126

¿Qué tal esta opción?

docker logs containername >& logs/myFile.log

No redirigirá los registros solicitados en la pregunta, sino que los copiará una vez a un archivo específico.

Eddy Hernández
fuente
Si no me equivoco, este comando básicamente copiará todos los registros de cuando se inició el contenedor para presentarlos en myFile.logs. Derecha.?
S Andrew
@SAndrew básicamente ¡sí! pero las nuevas versiones de Docker pueden cambiar. mejor ver docker logs --helppara estar seguro
Eddy Hernandez
38

docker logs -f <yourContainer> &> your.log &

Explicación:

  • -f(es decir --follow): escribe todos los registros existentes y continúa ( sigue ) registrando todo lo que viene a continuación.
  • &> redirige tanto la salida estándar como el error estándar.
  • Es probable que desee ejecutar ese método en segundo plano, por lo que el archivo &.
  • Puede separar salida y stderr por: > output.log 2> error.log(en lugar de usar &>).
juanmirocks
fuente
9

Para capturar tanto stdout como stderr desde su contenedor docker en un solo archivo de registro, ejecute lo siguiente:

docker logs container > container.log 2>&1
Jean Velloen
fuente
8

Suponiendo que tiene varios contenedores y desea agregar los registros en un solo archivo, debe usar algún agregador de registros como fluentd. fluentd se admite como controlador de registro para contenedores Docker.

Entonces, en docker-compose, debe definir el controlador de registro

  service1:
    image: webapp:0.0.1
    logging:
      driver: "fluentd"
      options:
        tag: service1 

  service2:
        image: myapp:0.0.1
        logging:
          driver: "fluentd"
          options:
            tag: service2

El segundo paso sería actualizar la configuración de fluentd para atender los registros tanto del servicio 1 como del servicio 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> 

En esta configuración, pedimos que los registros se escriban en un solo archivo en esta ruta
/fluentd/log/service/service.*.log

y el tercer paso sería ejecutar el fluentd personalizado que comenzará a escribir los registros en el archivo.

Aquí está el enlace para instrucciones paso a paso

Bit Long, pero de manera correcta, ya que obtiene más control sobre la ruta de los archivos de registro, etc. y también funciona bien en Docker Swarm.

Abhishek Galoda
fuente
1

Dado que Docker fusiona stdout y stderr para nosotros, podemos tratar la salida del registro como cualquier otro flujo de shell. Para redirigir los registros actuales a un archivo, use un operador de redirección

$ docker logs test_container > output.log
docker logs -f test_container > output.log

En lugar de enviar la salida a stderr y stdout, redirija la salida de su aplicación a un archivo y asigne el archivo a un almacenamiento permanente fuera del contenedor.

$ docker logs test_container> /tmp/output.log

Docker no aceptará rutas relativas en la línea de comando, por lo que si desea usar un directorio diferente, deberá usar la ruta completa.

Anish Varghese
fuente
1

Si trabaja en Windows y usa PowerShell (como yo), podría usar la siguiente línea para capturar stdouty stderr:

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

¡Espero que esto ayude a alguien!

mirind4
fuente
1
Para guardar todos los registros de contenedores en un archivo, según el nombre del contenedor ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket
1

La forma más fácil que uso es este comando en la terminal:

docker logs elk > /home/Desktop/output.log

la estructura es:

docker logs <Container Name> > path/filename.log
itssaifurrehman
fuente
1

Primero verifique su identificación de contenedor

docker ps -a

Puede ver la primera fila en las columnas de ID DE CONTENEDOR. Probablemente se vea así "3fd0bfce2806" y luego escríbalo en shell

docker inspect --format='{{.LogPath}}' 3fd0bfce2806

Verás algo como esto

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

entonces puedes verlo como

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

Estaría en formato JSON, puede usar la marca de tiempo para rastrear errores

kiran beethoju
fuente
0

Script de bash para copiar todos los registros del contenedor a un directorio específico:

#!/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
Mugen
fuente