¿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ó.
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.
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.
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
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 .
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
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