Como debugar logs de containers Docker

Para acessar logs de um container Docker, use docker logs <container>, funciona mesmo se o container estiver parado. Para filtrar por tempo: --since 30m ou --until 2026-06-07T10:00:00. Para seguir em tempo real: --follow (-f). Em Docker Compose, docker compose logs -f <serviço> é o equivalente. O log driver padrão json-file armazena em /var/lib/docker/containers/ no host.

Comandos essenciais de log

Os comandos mais úteis para acessar e filtrar logs de containers:

bash
# Todos os logs de um container
docker logs nome_container

# Últimas N linhas
docker logs --tail 100 nome_container

# Seguir em tempo real
docker logs -f nome_container

# Seguir com timestamp
docker logs -f -t nome_container

# Filtrar por janela de tempo
docker logs --since 1h nome_container        # última 1 hora
docker logs --since 30m nome_container       # últimos 30 minutos
docker logs --since 2026-06-07T09:00:00Z nome_container

# Docker Compose
docker compose logs -f --tail 50 nome_servico
docker compose logs -f   # todos os serviços

Logs de containers que crasharam

O Docker preserva os logs mesmo após o container parar ou crashar, você pode sempre recuperá-los:

bash
# Listar containers parados (incluindo crashados)
docker ps -a

# Ver logs do container crashado pelo ID ou nome
docker logs abc123def456

# Ver os últimos logs antes do crash
docker logs --tail 200 abc123def456

# Para encontrar o container mais recente de um serviço:
docker ps -a --filter "name=nome_do_servico" --format "table {{.ID}}	{{.Status}}	{{.Names}}"

Configurar rotação de logs (evitar disco cheio)

O driver padrão json-file não tem limite por padrão, logs crescem indefinidamente. Configure rotação globalmente ou por serviço:

bash
# Configuração global no daemon (afeta novos containers)
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
# sudo systemctl reload docker

# Por serviço no docker-compose.yml (substitui config global)
services:
  app:
    image: minha-app:latest
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"    # mantém 5 arquivos de 10MB = 50MB máximo

Localizar os logs no disco do host

Se você precisa de acesso direto aos arquivos de log (para grep, tail ou envio para um coletor externo):

bash
# Encontrar o path do arquivo de log de um container
docker inspect nome_container | grep '"LogPath"'

# Os arquivos ficam em:
# /var/lib/docker/containers/<container-id>/<container-id>-json.log

# Ler diretamente (requer sudo)
sudo tail -f $(docker inspect --format='{{.LogPath}}' nome_container)

# Grep no arquivo de log (formato JSON)
sudo grep '"error"' $(docker inspect --format='{{.LogPath}}' nome_container)

Logs de múltiplos containers com prefixo

Para monitorar vários serviços ao mesmo tempo, docker compose logs agrega e prefixa cada linha com o nome do serviço:

bash
# Todos os serviços do stack
docker compose logs -f --tail 50

# Múltiplos serviços específicos
docker compose logs -f app db redis

# Apenas erros (grep no output agregado)
docker compose logs --tail 200 2>&1 | grep -i "error|fatal|exception"

# Salvar logs em arquivo para análise posterior
docker compose logs --tail 1000 > logs-$(date +%Y%m%d-%H%M%S).txt

Não quer configurar manualmente?

Implante o Docker em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Após docker rm, os logs são apagados permanentemente. Para evitar isso em produção, configure um log driver externo (journald, syslog, Loki via docker plugin) antes de remover containers, eles enviam logs para fora do container em tempo real.

Apenas se você configurar log-driver: journald no daemon.json ou por container. Com o driver padrão json-file, os logs ficam nos arquivos JSON em /var/lib/docker/containers/ e são acessados via docker logs, não aparecem no journalctl.

docker logs não tem filtro nativo por conteúdo. Faça pipe com grep: docker logs nome_container 2>&1 | grep -i "error\|exception\|fatal". O 2>&1 é importante porque o Docker pode escrever em stderr dependendo da aplicação.

A aplicação provavelmente está escrevendo logs em arquivo (dentro do container) em vez de stdout/stderr. Docker captura apenas stdout e stderr. Configure a aplicação para logar no stdout, ou use docker exec bash -c "tail -f /caminho/do/log.txt" para acessar o arquivo interno.

Para centralização, configure um stack de logging: Loki + Promtail (leve, boa integração com Docker), ou Elasticsearch + Filebeat (mais robusto). O Promtail/Loki integra via docker plugin e coleta logs automaticamente com labels Docker.