Eu uso docker logs [container-name]
para ver os logs de um contêiner específico.
Existe uma maneira elegante de limpar esses logs?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
fonte
fonte
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Respostas:
A partir desta pergunta, há um one-liner que você pode executar:
ou há o comando truncado semelhante:
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 :
Você também pode configurá-lo como parte do seu arquivo daemon.json em vez de modificar seus scripts de inicialização:
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:ou em um arquivo de composição:
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:
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 .
fonte
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 registroecho -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:
Você pode precisar de sudo
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)
fonte
containers
não está disponível de outra forma.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- funcionou para mimerror 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:
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)
fonte
fonte
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
fonte
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:
A primeira linha obtém o caminho do arquivo de log, semelhante à resposta aceita.
A segunda linha
nsenter
que permite executar comandos naxhyve
VM que servidores como host para todos os contêineres do Docker4Mac. O comando que executamos é o familiartruncate -s0 $LOGPATH
das respostas que não são do Mac.Se você estiver usando
docker-compose
, a primeira linha se tornará:e
<service>
é o nome do serviço do seudocker-compose.yml
arquivo.Agradecemos a https://github.com/justincormack/nsenter1 pelo
nsenter
truque.fonte
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.
fonte
Como um usuário root , tente executar o seguinte:
ou
ou
fonte
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:
fonte
Eu prefiro este (das soluções acima):
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:
fonte
Você também pode fornecer os parâmetros de log-op na
docker run
linha de comando, assim:ou em um docker-compose.yml como este
Créditos: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
fonte
"5"
e"10m"
, respectivamente), como mostrado aqui para o arquivo daemon.json global, mas é o mesmo para uma janela de encaixe-compose.yml. Nos dois casos, isso afetará apenas os contêineres criados recentemente."5"
ele funciona. O10m
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, executadodocker-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
fonte
docker exec -it default sh
para inserir um shell sh em um contêiner. No entanto, muitos contêineres não disponibilizam implicitamente osudo
comando.