¿cómo redirigir los registros de docker a un solo archivo?


Quiero redirigir todos los registros de mi contenedor docker a un único archivo de registro para analizarlos. He intentado

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

Pero esto da log en dos archivos diferentes. Ya he intentado

docker logs container > /tmp/stdout.log

, Pero no funcionó.

Author: pl_rock, 2016-12-14

5 answers

No es necesario redirigir los registros.

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

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

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

Abra ese archivo de registro y analice.

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

EDITAR:

Para ver los registros en vivo puede ejecutar debajo del comando

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

Nota:

Este archivo de registro /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log se creará solo si docker genera registros si no hay registros, entonces este archivo no estará allí. es similar como en algún momento si ejecutamos command docker logs containername y no devuelve nada. En ese escenario este archivo no estará disponible.

 54
Author: pl_rock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 05:15:11

Qué tal esta opción:

docker logs containername >& logs/myFile.log

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

 64
Author: Eddy Hernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 12:57:08

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 después.
  • Es probable que desee ejecutar ese método en segundo plano, por lo tanto el &.
  • Puede separar la salida y stderr de la siguiente manera: > output.log 2> error.log
 5
Author: juanmirocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 16:18:50

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

Así que 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 para el servicio 1 como para el 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, estamos pidiendo que los registros se escriban en un solo archivo para esto 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

Poco largo, 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 .

 4
Author: Abhishek Galoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-16 16:07:27

Script Bash para copiar todos los registros de contenedores a un directorio especificado:

#!/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
Author: Mugen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 12:27:17