Como usar o comando docker logs no Docker Desktop para visualizar logs

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker desktop logs para visualizar e analisar os logs gerados pelos seus contêineres Docker. Compreender os logs de contêineres é crucial para depurar aplicações e monitorar seu comportamento.

Este laboratório prático irá guiá-lo através da visualização de logs básicos de contêineres e, em seguida, demonstrará como filtrar esses logs com base na prioridade, intervalo de tempo e na unidade específica (contêiner ou serviço) que gera os logs. Ao final deste laboratório, você estará proficiente no uso do comando docker desktop logs para obter informações valiosas sobre suas aplicações em contêineres.

Visualizar logs básicos do Docker Desktop

Nesta etapa, você aprenderá como visualizar logs básicos de contêineres Docker. Os logs são essenciais para depurar e monitorar suas aplicações em execução em contêineres.

Primeiro, vamos executar um contêiner simples que gera alguma saída. Usaremos a imagem hello-world, que é uma imagem muito pequena que imprime uma mensagem e sai.

docker run hello-world

Você deve ver uma saída semelhante a esta, indicando que o daemon Docker puxou a imagem e executou o contêiner com sucesso:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f52335ce493178fc15f729218f180e9988e31c374a6ce98da40cbb890f97f10e
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To learn more, try the following commands:
 docker run -it ubuntu bash
 docker images
 docker ps
 docker stop <containerid>
 docker rm <containerid>
To get started with Docker Desktop, visit:
 https://www.docker.com/products/docker-desktop

A saída que você vê é o fluxo de saída padrão (stdout) e o fluxo de erro padrão (stderr) do contêiner. O Docker captura esses fluxos e os disponibiliza como logs.

Agora, vamos executar um contêiner que permanece em execução e gera logs ao longo do tempo. Usaremos a imagem alpine e executaremos um comando simples que imprime uma mensagem a cada 5 segundos.

Primeiro, puxe a imagem alpine:

docker pull alpine

Você deve ver uma saída indicando que a imagem está sendo puxada:

Using default tag: latest
latest: Pulling from library/alpine
... (output showing download progress)
Digest: sha256:...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Agora, execute o contêiner alpine em modo detached (-d) para que ele seja executado em segundo plano e dê a ele um nome (--name mylogger) para facilitar a referência. O comando while true; do echo "Hello from mylogger at $(date)"; sleep 5; done imprimirá uma mensagem com a data atual a cada 5 segundos.

docker run -d --name mylogger alpine sh -c 'while true; do echo "Hello from mylogger at $(date)"; sleep 5; done'

Este comando irá gerar o ID do contêiner.

Para visualizar os logs do contêiner em execução, use o comando docker logs seguido pelo nome ou ID do contêiner.

docker logs mylogger

Você verá a saída gerada pelo comando do contêiner, com uma nova linha aparecendo aproximadamente a cada 5 segundos. Você pode pressionar Ctrl+C para parar de visualizar os logs.

Para acompanhar os logs em tempo real, use a opção -f (follow):

docker logs -f mylogger

Isso exibirá continuamente novas entradas de log à medida que são geradas. Pressione Ctrl+C para parar de acompanhar os logs.

Finalmente, vamos parar e remover o contêiner que criamos:

docker stop mylogger
docker rm mylogger

Isso limpa os recursos do contêiner.

Filtrar logs por prioridade

Nesta etapa, você aprenderá como filtrar os logs de contêineres Docker com base em seu nível de prioridade. Embora o docker logs padrão não tenha filtragem de prioridade integrada como o systemd-journald, você pode obter uma filtragem semelhante usando ferramentas como grep para pesquisar palavras-chave ou padrões específicos na saída do log.

Vamos usar o contêiner alpine que usamos na etapa anterior. Se você o parou e removeu, execute-o novamente:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

Este comando executa o contêiner em modo detached e imprime mensagens com diferentes prefixos de "prioridade" (INFO, WARNING, ERROR) a cada 5 segundos.

Agora, vamos visualizar os logs e filtrá-los para mostrar apenas as linhas que contêm "ERROR". Podemos canalizar a saída de docker logs para grep.

docker logs mylogger | grep "ERROR"

Você verá apenas as linhas dos logs do contêiner que contêm a palavra "ERROR".

Da mesma forma, para visualizar apenas as linhas contendo "WARNING":

docker logs mylogger | grep "WARNING"

E para visualizar as linhas contendo "INFO":

docker logs mylogger | grep "INFO"

Você também pode combinar filtros. Por exemplo, para ver linhas contendo "WARNING" ou "ERROR", você pode usar a opção -E com grep para expressões regulares estendidas e o operador |:

docker logs mylogger | grep -E "WARNING|ERROR"

Isso mostrará todas as entradas de log que são avisos ou erros.

Lembre-se de que este método depende da aplicação do contêiner escrever logs com palavras-chave específicas. Para um registro mais estruturado e filtragem avançada, considere usar um driver de registro dedicado ou uma solução de registro fora do Docker.

Finalmente, pare e remova o contêiner:

docker stop mylogger
docker rm mylogger

Filtrar logs por intervalo de tempo

Nesta etapa, você aprenderá como filtrar os logs de contêineres Docker com base em um intervalo de tempo específico. Isso é útil para examinar logs de um período específico, por exemplo, durante um incidente ou uma implantação específica.

O comando docker logs oferece opções para filtrar logs por tempo. Usaremos o contêiner alpine novamente. Se ele não estiver em execução, inicie-o com o mesmo comando que antes:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

Deixe o contêiner em execução por um ou dois minutos para gerar alguns logs.

Para visualizar os logs gerados desde um horário específico, use a opção --since. O tempo pode ser especificado em vários formatos, incluindo um timestamp (segundos desde a época), um tempo relativo (por exemplo, 10m para 10 minutos, 1h para 1 hora) ou uma string de data/hora.

Vamos visualizar os logs gerados nos últimos 2 minutos:

docker logs --since 2m mylogger

Este comando exibirá todas as entradas de log do contêiner mylogger que foram geradas nos últimos 2 minutos.

Você também pode especificar um horário de início e término usando --since e --until. A opção --until funciona de forma semelhante a --since, permitindo que você especifique um horário até o qual deseja ver os logs.

Para visualizar os logs gerados entre 5 minutos atrás e 1 minuto atrás:

docker logs --since 5m --until 1m mylogger

Este comando mostrará os logs da janela de tempo especificada. Observe que a saída exata dependerá de quando você executar o comando e por quanto tempo o contêiner está em execução.

Você também pode usar timestamps específicos. Para obter o timestamp atual, você pode usar o comando date +%s.

Vamos obter o timestamp de 1 minuto atrás:

date -d "1 minute ago" +%s

Agora, use este timestamp com --until para ver os logs até 1 minuto atrás:

docker logs --until $(date -d "1 minute ago" +%s) mylogger

Este comando exibirá os logs desde o início da vida útil do contêiner até 1 minuto atrás.

A filtragem por intervalo de tempo é uma maneira poderosa de restringir sua análise de log e se concentrar em eventos relevantes.

Finalmente, pare e remova o contêiner:

docker stop mylogger
docker rm mylogger

Filtrar logs por unidade

Nesta etapa, você aprenderá como filtrar os logs de contêineres Docker pela "unidade" que os gerou. No contexto dos logs do Docker, a "unidade" normalmente se refere ao próprio contêiner. Embora o docker logs opere inerentemente em um único contêiner (ou unidade), entender esse conceito é importante ao trabalhar com sistemas de registro mais avançados ou quando você precisa distinguir logs de diferentes contêineres.

A principal maneira de filtrar logs por unidade no Docker é especificando o nome ou ID do contêiner ao usar o comando docker logs. Temos feito isso nas etapas anteriores.

Vamos executar dois contêineres diferentes para ver como seus logs são separados. Usaremos a imagem alpine para ambos, mas com nomes diferentes e comandos ligeiramente diferentes.

Primeiro, certifique-se de que o contêiner mylogger das etapas anteriores esteja parado e removido.

docker stop mylogger || true
docker rm mylogger || true

Agora, execute o primeiro contêiner, chamado container1:

docker run -d --name container1 alpine sh -c 'while true; do echo "Container 1 log at $(date)"; sleep 3; done'

Este contêiner imprimirá uma mensagem de log a cada 3 segundos.

Em seguida, execute um segundo contêiner, chamado container2:

docker run -d --name container2 alpine sh -c 'while true; do echo "Container 2 log at $(date)"; sleep 5; done'

Este contêiner imprimirá uma mensagem de log a cada 5 segundos.

Agora, para visualizar os logs especificamente de container1, use:

docker logs container1

Você verá apenas as mensagens de log geradas por container1.

Para visualizar os logs especificamente de container2, use:

docker logs container2

Você verá apenas as mensagens de log geradas por container2.

Isso demonstra como docker logs filtra inerentemente pelo contêiner especificado (a "unidade"). Se você estivesse usando um sistema de registro centralizado que coleta logs de vários contêineres, normalmente usaria metadados associados a cada entrada de log (como nome ou ID do contêiner) para filtrar por unidade.

Embora o próprio docker logs não tenha uma flag --unit separada como algumas ferramentas de registro do sistema, o conceito fundamental de filtragem pela fonte do log (o contêiner) é alcançado especificando o nome ou ID do contêiner.

Finalmente, pare e remova ambos os contêineres:

docker stop container1 container2
docker rm container1 container2

Resumo

Neste laboratório, você aprendeu a habilidade fundamental de visualizar os logs de contêineres Docker usando o comando docker logs. Você começou executando contêineres simples como hello-world e alpine para entender como o Docker captura as saídas padrão e os fluxos de erro como logs. Esta etapa inicial demonstrou o processo básico de acesso à saída do contêiner, o que é crucial para monitorar e depurar aplicativos em execução dentro de contêineres.

Com base na visualização básica de logs, você explorou opções avançadas de filtragem para gerenciar e analisar dados de log de forma eficiente. Você aprendeu como filtrar logs por níveis de prioridade, permitindo que você se concentre em mensagens críticas. Além disso, você praticou a filtragem de logs por intervalos de tempo específicos para isolar eventos dentro de um período específico e por unidade para visualizar logs de serviços ou componentes específicos. Essas técnicas de filtragem são essenciais para navegar por grandes volumes de dados de log e identificar rapidamente informações relevantes para solução de problemas e análise.