Do not speak Portuguese? Translate this site with Google or Bing Translator
Limpeza de logs docker

Posted on: July 11, 2022 05:49 PM

Posted by: Renato

Categories: Docker devops servers linux

Views: 115

Limpeza e organização nos logs de containers docker

## Logs do Docker

Os logs dos containers docker são mantidos em arquivos encontrados em /var/lib/docker/containers/*/*-.log.

As vezes criamos aplicações "verbosas" que podem acabar com nosso espaço em disco, por este motivo é importante manter os logs por um período ou relevância.

Não seria nada legal prejudicar as aplicações de um nó ou servidor, por falta de espaço em disco, pois nosso querido container está "tagarelando" no arquivo de log, pois alguém esqueceu de desativar o debug, não é caro desenvolvedor?

## Habilitando o Log Rotate

O logrotate é uma ferramenta muito conhecida no linux que tem como objetivo rotacionar os arquivos de log, é possível habilitar a rotação por tamanho do arquivo, dias e outras configurações.

Para configurar será necessário criar o arquivo abaixo:

    `/etc/logrotate.d/docker-container`

```
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=1M
  missingok
  delaycompress
  copytruncate
}
```


Uma vez que o arquivo foi criado, basta testar a rotação com o comando abaixo.

`logrotate -fv /etc/logrotate.d/docker-container`

Pronto rotação configurada, você verá um novo arquivo compactado (.gz) a cada rotação, agora é só deixar o logrotate fazer o trabalho.

Veja mais configurações nas referências.
Limpeza manual

Também é possível executar a limpeza na força bruta, onde todos os logs serão apagados com o comando abaixo:

Atenção! Todos os logs.

`truncate -s 0 /var/lib/docker/containers/*/*-json.log`

## Conclusão

A rotação de log é facilitada com o logrotate, em produção podemos utilizar o ELK para obter um monitoramento e analise dos logs.


## Como removi manualmente?

Eu entrei via bash no caminho `/var/lib/docker/containers/`
e cada container entrei e limpei o arquivo deixando ele zerado com este command:

`truncate *.log --size 0`

Vê que outros devops usam assim:

`truncate -s 0 /var/lib/docker/containers/*/*-json.log`

ou com sudo

`sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"`


## Outro meios editando o json

Em vez disso, você pode fazer com que o Docker gire automaticamente os logs para você. Isso é feito com sinalizadores adicionais para dockerd se você estiver usando o driver de registro JSON padrão:

    `dockerd ... --log-opt max-size=10m --log-opt max-file=3`

Você também pode definir isso como parte de 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 docker de recarregamento systemctl depois de alterar esse arquivo para que as configurações sejam aplicadas. Essa configuração será o padrão para todos os contêineres recém-criados. Observe que os contêineres existentes precisam ser excluídos e recriados para receber os novos limites de log. `systemctl reload docker`

Opções de log semelhantes podem ser passadas para contêineres individuais para substituir esses padrões, permitindo que você salve mais ou menos logs em contêineres individuais. No docker run, isso 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"

```

## Ou

```
my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-size: "10m"
        max-file: "5"
```
   

Para economia de espaço adicional, você pode alternar do driver de log json para o driver de log "local". Ele usa as mesmas opções max-size e max-file, mas em vez de armazenar em json, ele usa uma sintaxe binária que é mais rápida e menor. Isso permite que você armazene mais logs no mesmo arquivo de tamanho. 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 é que os analisadores/encaminhadores de log externos que dependiam do acesso direto aos logs json não funcionarão mais. Portanto, se você usar uma ferramenta como filebeat para enviar para o Elastic ou o encaminhador universal do Splunk, evitaria o driver "local".

## Script 

Se você precisar armazenar um backup dos arquivos de log antes de excluí-los, criei um script que executa as seguintes ações (você precisa executá-lo com sudo) para um contêiner especificado:

* 1 Cria uma pasta para armazenar arquivos de log compactados como backup.
* 2 Procura o id do contêiner em execução (especificado pelo nome do contêiner).
* 3 Copie o arquivo de log do contêiner para um novo local (pasta na etapa 1) usando um nome aleatório.
* 4 Compacte o arquivo de log anterior (para economizar espaço).
* 5 Trunca o arquivo de log do contêiner por determinado tamanho que você pode definir.

Notas:

- Ele usa o comando shuf. Certifique-se de que sua distribuição Linux o tenha ou altere-o para outro gerador aleatório suportado pelo bash.
- Antes de usar, altere a variável CONTAINER_NAME para corresponder ao seu contêiner em execução; pode ser um nome parcial (não precisa ser o nome correspondente exato).
- Por padrão, ele trunca o arquivo de log para 10M (10 megabytes), mas você pode alterar esse tamanho - modificando a variável SIZE_TO_TRUNCATE.
- Ele cria uma pasta no caminho: /opt/your-container-name/logs, se você quiser armazenar os logs compactados em outro lugar, basta alterar a variável LOG_FOLDER.
- Execute alguns testes antes de executá-lo em produção.

```sh
#!/bin/bash
set -ex

############################# Main Variables Definition:
CONTAINER_NAME="your-container-name"
SIZE_TO_TRUNCATE="10M"

############################# Other Variables Definition:
CURRENT_DATE=$(date "+%d-%b-%Y-%H-%M-%S")
RANDOM_VALUE=$(shuf -i 1-1000000 -n 1)
LOG_FOLDER="/opt/${CONTAINER_NAME}/logs"
CN=$(docker ps --no-trunc -f name=${CONTAINER_NAME} | awk '{print $1}' | tail -n +2)
LOG_DOCKER_FILE="$(docker inspect --format='{{.LogPath}}' ${CN})"
LOG_FILE_NAME="${CURRENT_DATE}-${RANDOM_VALUE}"

############################# Procedure:
mkdir -p "${LOG_FOLDER}"
cp ${LOG_DOCKER_FILE} "${LOG_FOLDER}/${LOG_FILE_NAME}.log"
cd ${LOG_FOLDER}
tar -cvzf "${LOG_FILE_NAME}.tar.gz" "${LOG_FILE_NAME}.log"
rm -rf "${LOG_FILE_NAME}.log"
truncate -s ${SIZE_TO_TRUNCATE} ${LOG_DOCKER_FILE}


```

### Você pode criar um cronjob para executar o script anterior todo mês. Primeira corrida:

`sudo crontab -e`

Digite a no teclado para entrar no modo de edição. Em seguida, adicione a seguinte linha:

`0 0 1 * * /your-script-path/script.sh`


## Referências

    Ótimo artigo sobre logrotate no Digital Ocean.


    - https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-16-04
    - https://docs.docker.com/config/containers/logging/json-file/
    - https://stackoverflow.com/questions/42510002/docker-how-to-clear-the-logs-properly-for-a-docker-container
    


2

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (12) Variados (108) PHP (102) Laravel (110) Black Hat (3) front-end (24) linux (82) postgresql (34) Docker (12) rest (4) soap (1) webservice (5) October (1) CMS (2) node (6) backend (10) ubuntu (38) devops (21) nodejs (4) npm (1) nvm (0) git (3) firefox (1) react (6) reactnative (5) collections (1) javascript (4) reactjs (7) yarn (0) adb (1) solid (0) blade (2) models (1) controllers (0) log (0) html (2) hardware (2) aws (14) Transcribe (2) transcription (1) google (3) ibm (1) nuance (1) PHP Swoole (4) mysql (22) macox (2) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (1) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (13) faceapp (1) eloquent (11) query (2) sql (35) ddd (3) nginx (6) apache (4) certbot (1) lets-encrypt (2) debian (9) liquid (1) magento (1) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (1) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (2) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (1) binaural (1) mysqli (3) database (32) windows (2) vala (1) json (2) oracle (1) mariadb (2) dev (12) webdev (23) s3 (4) storage (1) kitematic (1) gnome (2) web (1) intel (1) piada (1) cron (2) dba (12) lumen (1) ffmpeg (1) android (2) aplicativo (1) fedora (2) shell (3) bash (2) script (2) lider (1) htm (1) csv (1) dropbox (1) db (2) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (0) biologia (1) programming (20) performance (1) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (1) microg (1) iode (1) ssh (1) zsh (1) terminal (1) dracula (1) spaceship (1) mac (1) idiomas (1) laptop (1) developer (24) api (1) data (1) matematica (1) seguranca (2) 100DaysOfCode (5) hotfix (1) documentation (1) laravel (1) RabbitMQ (1) Elasticsearch (1) redis (1) Raspberry (3) Padrao de design (3) JQuery (0) angularjs (2) Dicas (7) kubenetes (1) vscode (1) backup (1) angular (1) servers (2) pipelines (1) AppSec (1) DevSecOps (2) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (1) security (1) translate (1) kube (1) iot (1) politica (1) bolsonaro (1) flow (1) podcast (1) Brasil (1)

New Articles



Get Latest Updates by Email