Eu uso docker logs [container-name]
para ver os logs de um contêiner específico.
Existe uma maneira elegante de limpar esses logs?
Eu uso docker logs [container-name]
para ver os logs de um contêiner específico.
Existe uma maneira elegante de limpar esses logs?
Respostas:
A partir desta pergunta, há um one-liner que você pode executar:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
ou há o comando truncado semelhante:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Eu não sou um grande fã de nenhum deles, pois eles modificam os arquivos do Docker diretamente. A exclusão do log externo pode ocorrer enquanto o docker estiver gravando dados formatados em json no arquivo, resultando em uma linha parcial e interrompendo a capacidade de ler todos os logs do docker logs
CLI.
Em vez disso, você pode fazer com que o Docker gire os logs automaticamente para você. Isso é feito com sinalizadores adicionais para o dockerd, se você estiver usando o driver de log JSON padrão :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Você também pode configurá-lo como parte do seu arquivo daemon.json em vez de modificar seus scripts de inicialização:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Essas opções precisam ser configuradas com acesso root. Certifique-se de executar um systemctl reload docker
após alterar este arquivo para aplicar as configurações. Essa configuração será o padrão para todos os contêineres criados recentemente. Observe que os contêineres existentes precisam ser excluídos e recriados para receber os novos limites de log.
Opções de log semelhantes podem ser passadas para contêineres individuais para substituir esses padrões, permitindo salvar mais ou menos logs em contêineres individuais. A partir docker run
disso se parece com:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
ou em um arquivo de composição:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Para economizar espaço adicional, é possível alternar do driver de log json para o driver de log "local". Ele usa as mesmas opções de tamanho máximo e arquivo máximo, mas em vez de armazenar no json, ele usa uma sintaxe binária que é mais rápida e menor. Isso permite armazenar mais logs no mesmo tamanho de arquivo. A entrada daemon.json para isso se parece com:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
A desvantagem do driver local são os analisadores / encaminhadores de logs externos que dependiam do acesso direto aos logs json não funcionarão mais. Portanto, se você usar uma ferramenta como a filebeat para enviar ao Elastic, ou ao encaminhador universal do Splunk, eu evitaria o driver "local".
Eu tenho um pouco mais sobre isso na minha apresentação de Dicas e Truques .
service docker restart
que por si só não funcionou. Também tive que criar novos contêineres antes de entrar em vigor. ou seja, apenas abrir os contêineres antigos não aplicou o novo registro
echo -n > ...
. De qualquer forma, eu gostaria de ter mais controle sobre meus logs. Por exemplo, após a reinicialização do docker-compose , eu adoraria ter o mecanismo para fazer algo com os logs preservados.
Usar:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Você pode precisar de sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref. Jeff S. Como limpar os logs corretamente para um contêiner do Docker?
Referência: Truncando um arquivo enquanto ele está sendo usado (Linux)
containers
não está disponível de outra forma.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- funcionou para mim
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
No Docker para Windows e Mac, e provavelmente outros também, é possível usar a opção tail. Por exemplo:
docker logs -f --tail 100
Dessa forma, apenas as últimas 100 linhas são exibidas e você não precisa rolar primeiro pelas linhas de 1 milhão ...
(E, portanto, excluir o log provavelmente não é necessário)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, obter apenas o tamanho total dos logssudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Você pode configurar a rotação do log para limpar os logs periodicamente.
Arquivo de exemplo em /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? arquivo /etc/logrotate.d/docker-logs
não existe, eu tenho que criá-lo?
"log-opts"
como mostrado por BMitch) #
Docker4Mac, uma solução de 2018:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
A primeira linha obtém o caminho do arquivo de log, semelhante à resposta aceita.
A segunda linha nsenter
que permite executar comandos na xhyve
VM que servidores como host para todos os contêineres do Docker4Mac. O comando que executamos é o familiar truncate -s0 $LOGPATH
das respostas que não são do Mac.
Se você estiver usando docker-compose
, a primeira linha se tornará:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
e <service>
é o nome do serviço do seu docker-compose.yml
arquivo.
Agradecemos a https://github.com/justincormack/nsenter1 pelo nsenter
truque.
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Você não pode fazer isso diretamente através de um comando do Docker.
Você pode limitar o tamanho do log ou usar um script para excluir logs relacionados a um contêiner. Você pode encontrar exemplos de scripts aqui (leia a parte inferior): Funcionalidade: Capacidade de limpar o histórico de registros # 1083
Confira a seção de log da referência do arquivo docker-compose, onde é possível especificar opções (como rotação e limite de tamanho do log) para alguns drivers de log.
Como um usuário root , tente executar o seguinte:
> /var/lib/docker/containers/*/*-json.log
ou
cat /dev/null > /var/lib/docker/containers/*/*-json.log
ou
echo "" > /var/lib/docker/containers/*/*-json.log
Nos meus servidores Ubuntu, mesmo com o sudo, eu recebia Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Mas pentear a janela de encaixe inspecionar e truncar respostas funcionou:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Eu prefiro este (das soluções acima):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
No entanto, estou executando vários sistemas (Ubuntu 18.x Bionic, por exemplo), onde esse caminho não funciona conforme o esperado. O Docker é instalado pelo Snap, portanto, o caminho para os contêineres é mais como:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Você também pode fornecer os parâmetros de log-op na docker run
linha de comando, assim:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
ou em um docker-compose.yml como este
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Créditos: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
ele funciona. O 10m
trabalho sem citar de fato.
Docker para usuários de Mac, aqui está a solução:
Encontre o caminho do arquivo de log por:
$ docker inspect | grep log
SSH na máquina docker (suponha que o nome seja default
, se não, executado docker-machine ls
para descobrir):
$ docker-machine ssh default
Mude para usuário root ( referência ):
$ sudo -i
Exclua o conteúdo do arquivo de log:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
para inserir um shell sh em um contêiner. No entanto, muitos contêineres não disponibilizam implicitamente o sudo
comando.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"