Compose: Característica: capacidad para borrar el historial de registros

Creado en 9 mar. 2015  ·  145Comentarios  ·  Fuente: docker/compose

Una característica que pensé que sería útil desde que usé originalmente Fig, y ahora Compose sería la capacidad de borrar el historial de registro para los contenedores administrados por Composed. Los contenedores de larga duración o "parlanchines" pueden terminar con mucho ruido de registro que tal vez no sea deseable.

Esperaría que un comando como el siguiente resolviera el problema:
$ docker-compose logs --clear [service]

arelogs kinenhancement

Comentario más útil

docker logs -c (clear) <container> sería genial.

+1

Todos 145 comentarios

No creo que sea una característica compatible con el demonio de la ventana acoplable. En cuanto a los documentos de la API, la única opción sería truncar los registros devueltos a un número limitado de líneas por contenedor:

https://docs.docker.com/reference/api/docker_remote_api_v1.17/#get -container-logs

: +1: para este problema. De hecho, utilizo compose para desarrollar un sitio web en Golang, Mongodb y nginx ... 5 días después de comenzar tengo registros largos que se vuelven preocupantes. Cada vez que reinicio los contenedores, agrego muchas líneas al registro.
@dnephin no entiendo si das una solución (que no entiendo :)) o si propones comprobar si es posible con api. Perdón por mi mal ingles.

Docker 1.6 agregará soporte para controladores de registro, consulte https://github.com/docker/docker/pull/10568 (actualmente; JSON, syslog y "none") el trabajo está en progreso para la rotación básica de registros; https://github.com/docker/docker/pull/11485

Es bueno escuchar eso, muchas gracias :)

Gracias por los antecedentes y la actualización de Docker 1.6. ¡Esperamos con ansias!

docker logs -c (clear) <container> sería genial.

+1

+1 Realmente importante

Santo cielo, me senté a través de varios minutos de troncos para llegar al final. Realmente agradecería esto también por el bien de no tener que reconstruir contenedores constantemente.

+1

+1

+1

: +1:

+1

+2

+1

Solo para el registro, con Docker 1.8 y docker-compose 1.4 ya existe un método para limitar el tamaño del registro usando https://docs.docker.com/compose/yml/#log -driver y log-opt max-size:

  log_driver: "json-file"
  log_opt:
    max-size: "100k"
    max-file: "20"

@dmage Gracias, exactamente lo que necesito.

+1000

A +1 le ENCANTARÍA esto

+1

La solución

@Rodeoclash : creo que un caso de uso para esto es la reutilización de un conjunto dado de contenedores para una nueva ejecución, es decir, ejecución de prueba de CI. Los registros antiguos son irrelevantes para la nueva ejecución, por lo que un clear antes del siguiente comando aclararía la confusión.

+1

+1, la misma necesidad que @rosskevin

Ok, para recapitular:

  • puede hacer esto desde un archivo de redacción (consulte https://github.com/docker/compose/issues/1083#issuecomment-141936600)
  • # 265 cubre la posibilidad de limitar la salida del comando logs
  • # 1756 cubre la caja del contenedor reutilizado

Voy a cerrar esto porque ya es compatible o se ha rastreado en otros problemas.

No entiendo muy bien por qué se cerró esto. ¿Cómo borras el historial de registros?

Añado:

  log_opt:
    max-size: 50k

Limitar la longitud de los troncos.

Realmente necesitan agregar esto, es esencial. Limitar los registros es bueno y todo, excepto debe haber un comando simple para borrar los registros.

docker logs -c <container>

¿Lo que da?

Entiendo cómo limitar el tamaño del registro, pero ¿cómo se borra el registro?

No creo que borrar un registro sea compatible con el motor de la ventana acoplable, que es lo que administraba los registros.

Tal vez con un controlador de registro personalizado podría hacer eso, pero sería externo para componer.

+1 por poder vaciar los troncos ...

+1

+1

+1

+1

+1 para comando borrar registro.

+1 para comando borrar registro

+1

+1

+1

: +1:

+1

+1

docker-logs-clean.sh

#!/bin/bash

rm $(docker inspect $1 | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

Invocación:

sudo ./docker-logs-clean.sh <container-name>;

@sgarbesi gracias!
+1

+1 para comando borrar registro

Cerrado a favor de?

Para reiterar mi comentario de https://github.com/docker/compose/issues/1083#issuecomment -149357280:

Ok, para recapitular:

  • puede hacer esto desde un archivo de redacción (consulte https://github.com/docker/compose/issues/1083#issuecomment-141936600)
  • # 265 cubre la posibilidad de limitar la salida del comando de registros
  • # 1756 cubre la caja del contenedor reutilizado

Si lo que está buscando es un comando como docker logs --clear , que no es compatible con el motor de la ventana acoplable, deberá solicitarlo en la ventana acoplable / acoplable. Sin embargo, creo que las opciones anteriores ya deberían ser suficientes para la mayoría de los casos. Lo que la mayoría de la gente quiere es mostrar un subconjunto de los registros, no eliminarlos.

Gracias @dnephin y a todos los demás por sus contribuciones. Planteé este problema hace casi un año y, a juzgar por los comentarios desde entonces, me parece bastante claro que la gestión de registros es un problema para muchos usuarios de redacción.

Se han mencionado algunas soluciones, yo mismo uso principalmente max-size para mantener los registros a una longitud razonable. Esto ayuda mucho y estoy agradecido por estas soluciones alternativas, pero es importante tener en cuenta que esta es una _ solución alternativa_, no una solución.

También me queda claro ahora que parte de la responsabilidad de solucionar este problema radica en el sistema de registro de Docker y que necesitaría proporcionar un comando clear para que Compose lo utilice, lo suficientemente justo.

Dicho todo esto, sin embargo, hay algunas características que se han incorporado a las versiones de Docker desde que se creó este ticket, a saber, --since=<timestamp> y --tail=<num-lines> que podrían ser compatibles con Compose para acercarse a dar un valor real solución a este problema.

Por ejemplo, admitir --since podría hacer posible algo como esto:

$ docker-compose logs --since=now my_container

o

$ docker-compose logs --since=5m my_container

El soporte para --tail también sería útil, p. Ej.

$ docker-compose logs --tail=100 my_container

y por supuesto, combinaciones de los mismos. También puede tener sentido admitirlos en docker-compose.yml como parte del bloque logging , pero incluso sin eso, con solo admitir estas dos opciones, sospecho que podría satisfacer a la mayoría de las personas que han + Hice este boleto.

En resumen, gracias de nuevo por todos los comentarios y soluciones, y por Docker y Compose, ambos son excelentes productos, espero que consideren las ideas presentadas en este hilo y continúen mejorando aún más estos productos.

Consulte el n. ° 2227 para obtener un resumen

: +1: gracias @dnephin , ¡ llegue !

Lo que hice fue eliminar manualmente los archivos <container-id>-json.log colocados dentro de /var/lib/docker/containers/<container-id>/ (use sudo ). Una vez que ejecuté docker-compose logs , el registro estaba vacío. No es una solución, pero con un archivo .bash adecuado puede automatizar la limpieza antes de cada compilación.

Editar: Algo como esto funciona (¡úsalo bajo tu propio riesgo!):

sudo find /var/lib/docker/containers/ -type f -name '*-json.log' -delete

+1

+1

+1

+1

+2

+2

+1

+20

+1

+1

+1

+1

@sgarbesi Después de ejecutar ese comando de limpieza, ¿la función de registro funcionará normalmente?

+1

docker-logs-clean.sh

#!/bin/bash

for container_id in $(docker ps -a --filter="name=$name" -q);

    do file=$(docker inspect $container_id | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

    if [ -f $file ]
      then
          rm $file;
    fi

done

Invocación:


chmod +x docker-logs-clean.sh

sudo ./docker-logs-clean.sh

+1 para la opción de línea de comando para borrar registros manualmente

@kassanmoor lo hace por mí.

+1

Gracias por otras formas de limpiar los registros de contenedores

👍

+1 👍

+1!

+1

+1

+1

Esta sería una gran característica, tengo algunos contenedores que están basados ​​en Java y después de uno o dos días, cuando se solucionan los problemas, puede tomar 30 segundos o más hacer un docker logs -f <container> porque Java adora esas líneas múltiples registros.

Otra cosa que podría ser más fácil de implementar es otra marca en los registros para iniciar una cola sin hacer eco de todos los registros existentes docker logs -f -n <container> por ejemplo (lo que significa seguir solo los registros nuevos). Esto solo haría eco de los mensajes de registro recibidos después de ejecutar el comando.

Lo contrario también funcionaría (y estaría más cerca de la forma en que funciona gnu tail) es hacer un -f echos las últimas 5-10 líneas y luego nuevas líneas por defecto y agregar una bandera para hacer eco de todo como lo hace ahora (tal vez docker logs -f -a <container> o algo).

En esa nota, me encantaría tener la función de gnu tail que permite especificar cuántas líneas seguir, como docker logs -100 <container> me da las últimas 100 líneas.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

¿Hay algún truco para Docker para mac? Gracias y +1 por una opción de línea de comando para esto :)

+1

+1

+1

ACTUALIZACIÓN: 2016/10/08 - Se eliminó el requisito de "jq" ya que los "registros de la ventana acoplable" son compatibles con las plantillas Go. (https://docs.docker.com/engine/admin/formatting/)

Hola a todos,

Porque eliminar archivos que podrían estar abiertos es generalmente una MALA idea, ¡especialmente si está tratando de ahorrar espacio en el disco! - He ampliado los esfuerzos iniciales de @sgarbesi , @lvitals y @wazoo (gracias por las ideas, chicos) para producir el siguiente script un poco más funcional.

Copie el siguiente código en un archivo
vi ./docker-container-log-trim.sh
Hacer que el archivo sea ejecutable
chmod +x ./docker-container-log-trim.sh
Luego ejecuta con
sudo ./docker-container-log-trim.sh

Descomente la línea con > cuando confíe en el script ... ahí es donde ocurre la magia. :-)

Comentarios bienvenidos.
Gracias.

PD. Probado, pero no endurecido. Utilizar bajo su propia responsabilidad.

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z $1 ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$logfile $(docker inspect --format '{{ .LogPath }}' $container)"
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} $logfile > $TEMP
      # Uncomment the next line when you trust the script!
      # cat $TEMP > $logfile
    done
  fi

  rm $TEMP
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

+1

+1

Entonces, dado que se expresó varias veces que hay un deseo de un comando claro explícito y dado que nunca se agregó uno, ¿hay alguna posibilidad de que se vuelva a abrir?

Depende, por supuesto, de un cambio en el motor de la ventana acoplable, pero aún es algo que eventualmente también deberá abordarse en la ventana acoplable-componer, y definitivamente no está arreglado en lo que respecta a un comando explícito.

@DavidPesticcio Recibo este error al ejecutar su script: line 53: $logfile: ambiguous redirect (después de eliminar el comentario)

Hola @gingerlime , Parece que $ TEMP no se está completando ... ¿quizás no tienes "mktemp" instalado, o quizás no está en tu camino? : - /

"Funciona bien para mí" - sí, lo sé, eso no te ayuda mucho, pero es verdad ... :-)

He actualizado el script, por lo que ya no necesitas "jq"; quizás debería agregar un rescate si también falta mktemp ... Pensé que era una herramienta estándar, pero tal vez no estés ejecutando el script dentro de una instalación "estándar", como desde un contenedor mínimo, ¿quizás? :-)

¡Espero que ayude!

Tengo mktemp , y lo uso con frecuencia ... Realmente no pasé mucho tiempo depurándolo. Terminé con el script más simple anterior que solo destruye esos registros. En nuestro entorno de desarrollo, no son importantes.

en mi configuración (es decir, ejecutándome sin usuario root) este script bash no está ayudando en caso de que se me niegue la autorización al intentar abrir el archivo de registro.

es un poco extraño que, como usuario, pueda iniciar la ventana acoplable, pero puedo tocar sus archivos de registro ...
más una razón para tener algo que gastar en los comandos docker / docker-compose

Tuve que modificar el script de @DavidPesticcio por los errores mencionados anteriormente ... aquí va:

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z "$1" ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$(docker inspect --format '{{.LogPath}}' $container)"
      if [ ! -f "$logfile" ]; then continue; fi
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} "$logfile" > "$TEMP"
      # Uncomment the next line when you trust the script!
      # cat "$TEMP" > "$logfile"
    done
  fi

  rm "$TEMP"
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

@dnephin, ¿hay alguna posibilidad de que esto se vuelva a abrir, ya que existe una demanda obvia de tener un comando claro explícito de una sola vez para los registros?

Truncar los registros de un contenedor determinado (debe ser root):

cp /dev/null $(docker inspect -f '{{.LogPath}}' container_name)

Quiere truncamiento, no eliminación. (Eliminar el archivo al que hace referencia un identificador de archivo abierto no recupera espacio hasta que el proceso, en este caso, el demonio Docker, finaliza por completo)

@oogali bastante justo. Aún así, sería bueno tener un comando adecuado para hacerlo a pedido.

+1

sería bueno tener un comando adecuado para ello

+1
Sería bueno tener un comando adecuado para hacerlo a pedido.

Esto es una obviedad, establecer una fecha de inicio como filtro es más trabajo que simplemente borrarlo para ver la salida actual. Agregue esta característica.

+1

+1

+1

+1

+1

Sugerencia relacionada tangencialmente:

Al hacer docker-compose logs -f , automáticamente predeterminado a --tail=30 (o cualquier otro número que sea razonable)

docker-compose logs -f no es suficiente porque con una gran cantidad de registros que se muestran, lleva mucho tiempo

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

O también existe esta solución

logpath=`docker inspect --format='{{.LogPath}}' reveelium_metricsextraction_1` && mv $logpath $logpath".bckup"

Por favor, deje de comentar +1. Hace que este hilo sea realmente difícil de leer y extraer información valiosa. Hay un botón de aprobación en la publicación OP para esto.

Nada aquí me funciona con Docker para mac. Sin embargo, he pirateado algo que funciona según la lectura de este hilo y los foros de Docker.

El problema con D4M es que en mac, es necesario ejecutar los comandos en xhyve vm. Así que esto es lo que se me ocurrió. Agregue estas dos funciones a su .bash_profile .

Importante : no olvide iniciar un nuevo shell o recargar su perfil antes de continuar.


Ahora, docker-logs-clean ve así:

#!/bin/bash -e

if [[ -z $1 ]]; then
    echo "No container specified"
    exit 1
fi

logFile=$(docker inspect -f '{{.LogPath}}' $1 2> /dev/null)

echo -n "Cleaning ${logFile}... "
d4mexec << EOF
> $logFile
EOF
echo "done"

Tenga en cuenta que no estoy rm en el archivo de registro, sino que estoy haciendo > , lo que truncará completamente el archivo.

FWIW en la versión 2 de docker-compose la función para limitar el tamaño de los archivos de registro:

version: '2'
services:
  my-service:
    image: nginx:alpine
    restart: always
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

No está muy bien documentado en el sitio web de Docker, y esto puede ser útil para otros.

+1

+1

+1

+1

+1

Hice un script simple docker_clear_log.sh :
sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' $1)
Uso: ./docker_clear_log.sh [Nombre-o-ID]
Debería funcionar si tiene derechos de sudo y configuración log_driver: "json-file" para su ventana acoplable (predeterminado).

+1

También intenté una solución temporal y parece funcionar

El problema original nunca se resolvió y el problema se cerró de todos modos. Interesante. @djessup , ¿qué te parecen esas manzanas?

todavía sería bueno tener una ventana acoplable-componer registros --clean

¿Por qué se ha cerrado este problema sin siquiera un comentario cuando el problema en sí mismo no se ha resuelto?

@linvi

Cuando llegué a este hilo, el comentario de cierre se había incorporado a otros comentarios. Está aquí mismo:

https://github.com/docker/compose/issues/1083#issuecomment -149357280

Creo que esperan cubrir este caso de uso particular a través de medios indirectos. Mencione su caso de uso particular y cómo no está cubierto, y podría ayudar a que se vuelva a abrir el ticket. En el peor de los casos, alguien podría señalar una manera fácil de obtener lo que desea: D

¿Alguna actualización?

cuando hay un registro, deberíamos poder borrarlo de una manera sencilla.

Sería muy bueno si pudieras incorporar el comando. esto no parece difícil.
miles de personas estarían muy felices de no tener que desplazarse por todo.

Si usa docker-compose, use lazydocker para ver los registros. Entonces, no es necesario eliminar los registros. Obtiene registros en vivo y comienza con los registros más recientes. Esto ayuda mucho con la depuración.

grafik

https://github.com/jesseduffield/lazydocker
Puede instalarlo con una línea y es una buena herramienta de monitoreo. Es una lástima que la gente no sea tan razonable para entender que una función de "eliminar registro" es algo bueno.

Pero la solución con la ventana acoplable perezosa lo hace por mí. Gracias jesseduffield por darnos la posibilidad de ser perezosos con su herramienta de monitoreo :-)
Tal vez considere donar a lazydocker si esto también facilita la depuración / monitoreo.
Y para ustedes, desarrolladores / mantenedores de Docker: ¿por qué la interfaz de Docker no es así?
Docker es bastante impresionante, pero eche un vistazo a lazydocker; Hay posibilidad de mejora.

+2147483647

+49324893

¿Fue útil esta página
0 / 5 - 0 calificaciones