Como usar o comando docker logs para visualizar a saída do contêiner

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker container logs para visualizar a saída gerada pelos seus contêineres Docker. Começaremos executando um contêiner simples que produz logs e, em seguida, exploraremos o uso básico do docker logs para recuperar essa saída.

Você aprenderá então como aprimorar a saída do log, incluindo timestamps (carimbos de data/hora) e informações detalhadas. Por fim, abordaremos como filtrar logs com base no tempo, permitindo que você visualize logs desde um ponto específico ou acompanhe a saída (tail), e como visualizar logs até um determinado momento. Este laboratório oferece experiência prática com técnicas essenciais de logging (registro de logs) do Docker para monitorar e depurar suas aplicações em contêineres.

Executar um contêiner que gera logs

Nesta etapa, aprenderemos como executar um contêiner Docker que gera logs. Os logs são essenciais para depurar e monitorar aplicações em execução dentro de contêineres. Usaremos uma imagem simples hello-world para este propósito, pois ela produz uma mensagem e depois sai, o que é um bom ponto de partida para ver o logging (registro de logs) básico do contêiner.

Primeiro, vamos baixar a imagem hello-world do Docker Hub. Isso garante que a imagem esteja disponível localmente antes de tentarmos executar um contêiner a partir dela.

docker pull hello-world

Você deve ver a saída indicando que a imagem está sendo baixada.

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Agora, vamos executar um contêiner usando a imagem hello-world. O comando docker run cria e inicia um novo contêiner. Por padrão, o Docker captura a saída padrão (stdout) e o erro padrão (stderr) do processo do contêiner e os armazena como logs.

docker run hello-world

Quando você executa este comando, o contêiner hello-world será executado, imprimirá uma mensagem no seu terminal e, em seguida, sairá. Esta mensagem é a saída que o Docker captura como logs.

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Embora a saída seja exibida diretamente no seu terminal ao executar um contêiner simples como hello-world, para contêineres em execução em segundo plano ou aplicações mais complexas, você precisará usar o comando docker logs para visualizar sua saída. Exploraremos o comando docker logs nas próximas etapas.

Visualizar logs básicos do contêiner

Na etapa anterior, executamos um contêiner hello-world que imprimiu uma mensagem no console e saiu. Embora isso tenha sido útil para uma demonstração rápida, aplicações do mundo real geralmente são executadas continuamente em segundo plano. Para visualizar a saída (logs) de tais contêineres, usamos o comando docker logs.

Primeiro, vamos executar um contêiner que permanece em execução e gera alguma saída. Usaremos uma imagem ubuntu simples e executaremos um comando que imprime uma mensagem a cada poucos segundos. Executaremos este contêiner em modo detached (-d) para que ele seja executado em segundo plano. Também damos a ele um nome (my-logging-container) para fácil identificação.

docker pull ubuntu
docker run -d --name my-logging-container ubuntu /bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done'

O comando docker pull ubuntu baixa a imagem Ubuntu. O comando docker run inicia um novo contêiner chamado my-logging-container em modo detached. O comando executado dentro do contêiner é /bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done', que é um script de shell simples que imprime uma mensagem com a data e hora atuais a cada 5 segundos.

Você verá um ID do contêiner impresso no seu console, indicando que o contêiner foi iniciado em segundo plano.

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
sha256:...

Agora que nosso contêiner está em execução e gerando logs, podemos visualizar esses logs usando o comando docker logs seguido pelo nome ou ID do contêiner.

docker logs my-logging-container

Este comando exibirá todos os logs gerados pelo my-logging-container desde que foi iniciado. Você deve ver uma série de mensagens "Hello from the container..." com carimbos de data/hora (timestamps).

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
...

O comando docker logs é uma ferramenta fundamental para inspecionar a saída de seus contêineres, o que é crucial para entender seu comportamento e diagnosticar problemas.

Visualizar logs com timestamps e detalhes

Na etapa anterior, visualizamos os logs básicos de um contêiner em execução. Embora a saída em si seja útil, ela frequentemente carece de contexto, como quando cada entrada de log foi gerada. O Docker oferece opções para incluir carimbos de data/hora e outros detalhes com os logs.

Para visualizar logs com carimbos de data/hora, podemos usar a flag -t ou --timestamps com o comando docker logs. Isso irá adicionar um carimbo de data/hora a cada entrada de log, mostrando quando ela foi escrita na saída padrão ou no erro padrão do contêiner.

Vamos visualizar os logs do nosso my-logging-container com carimbos de data/hora:

docker logs -t my-logging-container

Agora você verá os logs com um carimbo de data/hora no início de cada linha. Os carimbos de data/hora estão no formato RFC3339Nano (por exemplo, 2023-10-27T10:30:00.123456789Z).

2023-10-27T10:30:00.123456789Z Hello from the container at ...
2023-10-27T10:30:05.123456789Z Hello from the container at ...
2023-10-27T10:30:10.123456789Z Hello from the container at ...
...

Incluir carimbos de data/hora é crucial para analisar logs, especialmente ao tentar entender a sequência de eventos ou identificar quando um problema específico ocorreu.

Outra opção útil é a flag -f ou --follow, que permite que você transmita os logs em tempo real. Isso é semelhante ao uso do comando tail -f em um arquivo de log. Vamos tentar isso com nosso contêiner:

docker logs -f my-logging-container

Este comando exibirá os logs existentes e, em seguida, continuará a mostrar novas entradas de log à medida que são geradas pelo contêiner. Você verá novas mensagens "Hello from the container..." aparecendo a cada 5 segundos.

Para parar de acompanhar os logs, pressione Ctrl+C.

Combinar as flags -t e -f é uma prática comum para monitorar logs de contêineres em tempo real com carimbos de data/hora:

docker logs -tf my-logging-container

Isso fornece uma visualização ao vivo da saída do contêiner, tornando mais fácil observar seu comportamento e depurar problemas à medida que eles acontecem.

Visualizar logs a partir de um horário específico ou acompanhar a saída (tail)

Nesta etapa, exploraremos como visualizar os logs do contêiner gerados após um tempo específico ou visualizar apenas as entradas de log mais recentes. Isso é particularmente útil ao lidar com contêineres que estão em execução há muito tempo e geraram um grande volume de logs.

Para visualizar os logs gerados desde um tempo específico, você pode usar a flag --since. O valor para --since pode ser um carimbo de data/hora (como os que vimos com a flag -t) ou uma duração de tempo relativa (por exemplo, 10m para 10 minutos, 1h para 1 hora).

Vamos esperar alguns segundos para permitir que nosso my-logging-container gere mais alguns logs. Em seguida, visualizaremos os logs gerados nos últimos 30 segundos.

sleep 30
docker logs --since 30s my-logging-container

Este comando exibirá apenas as entradas de log que foram geradas nos últimos 30 segundos. A saída será semelhante aos logs completos, mas incluirá apenas as entradas recentes.

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
... (apenas logs dos últimos 30 segundos)

Outra necessidade comum é visualizar apenas as últimas linhas dos logs, semelhante ao uso do comando tail. Você pode conseguir isso usando a flag --tail, seguida pelo número de linhas que deseja ver.

Vamos visualizar as últimas 5 linhas dos logs do nosso contêiner:

docker logs --tail 5 my-logging-container

Este comando exibirá apenas as 5 entradas de log mais recentes do contêiner.

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ... (as últimas 5 linhas)

Você pode combinar --since e --tail com outras flags como -t e -f para obter visualizações mais específicas dos seus logs de contêiner. Por exemplo, para visualizar as últimas 10 linhas com carimbos de data/hora:

docker logs -t --tail 10 my-logging-container

Essas opções fornecem maneiras poderosas de filtrar e visualizar os logs do contêiner, tornando mais fácil encontrar as informações que você precisa rapidamente.

Visualizar logs até um horário específico

Além de visualizar logs desde um tempo específico, você também pode visualizar logs gerados até um tempo específico usando a flag --until. Isso é útil para examinar logs até um determinado ponto no tempo, por exemplo, antes que um problema ocorresse.

O valor para --until também pode ser um carimbo de data/hora ou uma duração de tempo relativa.

Vamos esperar alguns segundos novamente para garantir que mais logs sejam gerados.

sleep 10

Agora, vamos visualizar os logs do nosso my-logging-container que foram gerados até 10 segundos atrás.

docker logs --until 10s my-logging-container

Este comando exibirá todas as entradas de log desde o início da vida útil do contêiner até aproximadamente 10 segundos antes de você executar o comando. Você verá as entradas de log iniciais, mas as mais recentes serão excluídas.

Hello from the container at ...
Hello from the container at ...
... (logs até 10 segundos atrás)

Você pode combinar --since e --until para visualizar logs dentro de um intervalo de tempo específico. Por exemplo, para visualizar logs gerados entre 2 minutos atrás e 30 segundos atrás:

docker logs --since 2m --until 30s my-logging-container

Este comando mostrará apenas as entradas de log que se enquadram nessa janela de tempo específica.

Finalmente, para limpar o contêiner em execução, você pode pará-lo e removê-lo.

docker stop my-logging-container
docker rm my-logging-container

O comando docker stop envia um sinal de parada para o contêiner, e docker rm remove o contêiner.

Entender como filtrar logs por tempo é uma habilidade poderosa para depurar e analisar o comportamento de seus contêineres Docker.

Resumo

Neste laboratório, aprendemos como visualizar logs de contêineres usando o comando docker logs. Começamos executando um contêiner simples hello-world para entender como o Docker captura a saída padrão como logs.

Em seguida, exploramos o uso básico de docker logs para recuperar a saída de um contêiner. Também aprendemos como aprimorar a saída de log, incluindo carimbos de data/hora e informações detalhadas, e como filtrar logs com base no tempo, visualizando logs desde um tempo específico ou até um tempo específico, e como exibir a saída final para ver as últimas entradas de log.