Como Compactar Arquivos de Log Antigos Automaticamente com Python e Gzip
Sistemas em produção acumulam arquivos de log diariamente, o que pode consumir rapidamente o espaço em disco se não houver um ciclo de limpeza ou compressão. A solução abaixo percorre um diretório, identifica arquivos com extensão .log modificados há mais do que um número determinado de dias e os compacta no formato .gz, liberando armazenamento sem perder o histórico.
Python
import os
import time
import gzip
import shutil
def compactar_logs_antigos(diretorio: str, dias_limite: int = 7) -> None:
"""
Localiza logs alterados ha mais de `dias_limite` e os comprime em formato .gz.
"""
segundos_limite = dias_limite * 86400
tempo_atual = time.time()
if not os.path.exists(diretorio):
print(f"[ERRO] Diretório não encontrado: {diretorio}")
return
for arquivo in os.listdir(diretorio):
caminho_completo = os.path.join(diretorio, arquivo)
# Filtra apenas arquivos .log (ignora pastas e logs ja compactados em .gz)
if os.path.isfile(caminho_completo) and arquivo.endswith(".log"):
tempo_modificacao = os.path.getmtime(caminho_completo)
# Verifica se a ultima modificacao excede o limite de dias definido
if (tempo_atual - tempo_modificacao) > segundos_limite:
caminho_gz = f"{caminho_completo}.gz"
# Escreve o conteudo no arquivo comprimido e remove o original
with open(caminho_completo, "rb") as f_in:
with gzip.open(caminho_gz, "wb") as f_out:
shutil.copyfileobj(f_in, f_out)
os.remove(caminho_completo)
print(f"[COMPACTADO] {arquivo} -> {arquivo}.gz")
# Exemplo de uso pratico
if __name__ == "__main__":
pasta_logs = "./logs_aplicacao"
# Compacta arquivos .log da pasta com mais de 7 dias de inatividade
compactar_logs_antigos(pasta_logs, dias_limite=7)
Pontos-chave
- Economia de Espaço: A compressão via formato
Gzipreduz o tamanho de arquivos de texto puro em até 80-90%, ideal para retenção de dados a longo prazo. - Timestamp de Modificação: A função
os.path.getmtime()retorna a data/hora do último ajuste do arquivo em segundos desde a Epoch, permitindo cálculos simples de diferença de tempo (86400segundos = 24 horas). shutil.copyfileobj: Transfere dados em streams em blocos de memória em vez de carregar arquivos inteiros para a RAM, garantindo estabilidade mesmo em logs gigantescos de vários gigabytes.- Agendamento no S.O.: Para automação contínua de rotina em servidores de infraestrutura, agende a execução deste script via
cron(Linux) ouTask Scheduler(Windows).
