Configurando Limites do Journal do Systemd: Otimizando o Uso de Disco e a Rotação de Logs

Configure o tamanho do journal do systemd e os limites de retenção com `journald.conf`, `journalctl` e comandos seguros de limpeza de logs.

Configurando Limites do Journal do Systemd: Otimizando o Uso de Disco e a Rotação de Logs

Os logs do sistema são úteis até que silenciosamente preencham o disco. Em sistemas Linux que usam systemd, o systemd-journald armazena logs indexados e pode impor limites de tamanho e idade para que seu journal mantenha histórico suficiente sem ocupar espaço desnecessário no resto do sistema.

Este guia mostra onde configurar os limites do journal do systemd, como o armazenamento persistente e volátil diferem e como verificar a limpeza com journalctl.

Entendendo os Modos de Armazenamento do Journal

Antes de definir limites, é essencial entender onde o journal armazena seus logs. O systemd-journald suporta dois modos principais de armazenamento, definidos pela diretiva Storage= no journald.conf.

1. Armazenamento Volátil (/run/log/journal)

O armazenamento volátil mantém os logs em um sistema de arquivos temporário, tipicamente tmpfs ou um diretório baseado em memória. Os logs armazenados aqui são perdidos na reinicialização do sistema.

  • Caso de Uso: Logs altamente temporários, ambientes com recursos limitados onde o histórico persistente não é necessário.
  • Configuração: Defina Storage=volatile.

2. Armazenamento Persistente (/var/log/journal)

O armazenamento persistente garante que os logs sobrevivam às reinicializações do sistema, tornando-o a escolha padrão para servidores e sistemas de produção. O diretório /var/log/journal é criado se não existir.

  • Caso de Uso: Sistemas de produção que exigem trilhas de auditoria e análise histórica.
  • Configuração: Defina Storage=persistent ou Storage=auto (padrão, que ativa o armazenamento persistente se /var/log/journal existir).

Dica: Se o sistema estiver configurado para Storage=auto e /var/log/journal não existir, os logs usarão o armazenamento volátil até que o diretório persistente seja criado.

O Arquivo de Configuração Principal

Todos os limites e comportamentos principais do systemd-journald são controlados através do arquivo de configuração principal, geralmente localizado em /etc/systemd/journald.conf.

# Edite o arquivo de configuração principal
sudo nano /etc/systemd/journald.conf

Para garantir que futuras atualizações de pacotes não sobrescrevam suas personalizações, é uma boa prática criar um arquivo de substituição no diretório /etc/systemd/journald.conf.d/. Por exemplo, crie /etc/systemd/journald.conf.d/01-custom-limits.conf.

Implementando Limites de Tamanho para Otimização de Disco

O método mais comum para controlar o crescimento do journal é definir limites máximos de uso de disco. Quando o tamanho especificado é excedido, o journald automaticamente começa a deletar os logs arquivados mais antigos até que o limite seja atingido.

SystemMaxUse (O Limite Persistente Absoluto)

Esta diretiva define o espaço total máximo em disco que os arquivos de journal persistentes (/var/log/journal) podem ocupar. Este é o mecanismo principal para controlar o uso persistente de disco.

Os arquivos de journal serão rotacionados e limpos se o tamanho total exceder este valor. Unidades comuns incluem K (kilobytes), M (megabytes), G (gigabytes) e T (terabytes).

Diretiva Descrição Exemplo de Valor
SystemMaxUse Tamanho máximo para dados de journal persistentes. 500M ou 2G

Exemplo de Configuração:

Para limitar o armazenamento persistente do journal a um máximo de 1 Gigabyte:

[Journal]
SystemMaxUse=1G

SystemKeepFree (Buffer de Segurança do Disco)

Enquanto SystemMaxUse define um limite, SystemKeepFree atua como uma medida de segurança crucial. Ele especifica a quantidade mínima de espaço em disco que deve permanecer livre no sistema de arquivos que contém os arquivos de journal.

Se o espaço livre disponível cair abaixo do valor de SystemKeepFree, o journald limpará os logs, mesmo que o limite SystemMaxUse ainda não tenha sido atingido. Isso impede que o crescimento dos logs preencha completamente o disco e pare operações críticas do sistema.

Diretiva Descrição Exemplo de Valor
SystemKeepFree Espaço livre mínimo necessário no sistema de arquivos do journal. 10% ou 4G

Melhor Prática: É altamente recomendável definir tanto SystemMaxUse quanto SystemKeepFree. Use uma porcentagem (%) para SystemKeepFree em discos grandes para melhor escalabilidade.

RuntimeMaxUse (Limite de Armazenamento Volátil)

Se você estiver usando armazenamento volátil (/run/log/journal), ou se estiver interessado em controlar o uso de memória/tmpfs mesmo com armazenamento persistente ativado, use RuntimeMaxUse. Isso controla o espaço em disco usado pelos arquivos de journal voláteis, que são temporários e residem na memória ou tmpfs.

Diretiva Descrição Exemplo de Valor
RuntimeMaxUse Tamanho máximo para dados de journal voláteis. 300M

Implementando Limites de Tempo para Retenção de Logs

Limites baseados em tamanho garantem que o espaço em disco seja mantido, mas não garantem a idade dos logs. Se o volume de logs for baixo, os logs podem persistir indefinidamente. Limites baseados em tempo garantem que os logs sejam rotacionados após uma duração específica, independentemente do tamanho total.

MaxRetentionSec

Esta diretiva especifica o tempo máximo que os logs devem ser retidos. Quaisquer logs mais antigos que esta duração serão automaticamente removidos, complementando os limites de tamanho.

Diretiva Descrição Exemplo de Valor
MaxRetentionSec Idade máxima dos logs a serem mantidos. 30 days, 1 month, 2 weeks

Exemplo de Configuração:

Para garantir que os logs nunca sejam mais antigos que 30 dias e que o armazenamento persistente total nunca exceda 5 Gigabytes:

[Journal]
Storage=persistent
SystemMaxUse=5G
SystemKeepFree=10%
MaxRetentionSec=30 days

Nota: Se MaxRetentionSec for definido como 30 dias e SystemMaxUse como 5G, o journald respeitará o limite que for atingido primeiro. Se o limite de 5G for atingido em 10 dias, logs mais antigos que 10 dias serão removidos, substituindo a política de retenção de 30 dias.

Passos Práticos: Aplicando e Verificando a Configuração

1. Verifique o Uso Atual do Journal

Antes de fazer alterações, verifique o uso atual de disco do journal:

journalctl --disk-usage

Exemplo de Saída:

Journals take up 3.4G of disk space.

2. Configure os Limites

Edite /etc/systemd/journald.conf (ou seu arquivo de substituição) e descomente/defina as diretivas desejadas. Por exemplo, para garantir uso máximo de 500MB e retenção de 30 dias:

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
MaxRetentionSec=30 days

3. Reinicie o Serviço do Journal

Para que as alterações entrem em vigor, o serviço systemd-journald deve ser reiniciado. Isso não afeta o registro ativo de logs, mas instrui o daemon a aplicar imediatamente as novas restrições de tamanho e iniciar o processo de limpeza.

sudo systemctl restart systemd-journald

4. Force a Limpeza Manualmente

Se o espaço em disco precisar ser recuperado imediatamente com base nos novos limites, a reinicialização do serviço geralmente é suficiente. Alternativamente, você pode limpar explicitamente os arquivos usando journalctl.

Para limpar logs e recuperar espaço, deixando apenas os últimos 500MB:

sudo journalctl --vacuum-size=500M

Para limpar logs mais antigos que 7 dias:

sudo journalctl --vacuum-time=7d

Resumo das Diretivas Principais

Diretiva Escopo Propósito
Storage Global Define o local de armazenamento (persistente, volátil, automático).
SystemMaxUse Persistente (/var/log/journal) Tamanho máximo absoluto total para logs persistentes.
SystemKeepFree Persistente (/var/log/journal) Garante que uma quantidade mínima de espaço livre em disco permaneça.
RuntimeMaxUse Volátil (/run/log/journal) Tamanho máximo absoluto total para logs voláteis (tempo de execução).
MaxRetentionSec Ambos Define a idade máxima para logs retidos.

Conclusão

Defina limites do journal antes que os logs se tornem uma interrupção. Para a maioria dos servidores, use um arquivo de substituição em /etc/systemd/journald.conf.d/, defina SystemMaxUse mais SystemKeepFree, adicione MaxRetentionSec se você tiver um alvo de retenção, reinicie o systemd-journald e confirme o resultado com journalctl --disk-usage.