DEV Community

Cover image for Print não é log: Melhore seu debug com logging
Lucas Mateus
Lucas Mateus

Posted on

Print não é log: Melhore seu debug com logging

Quando começamos a programar em Python, é quase instintivo usar print() pra tudo: pra ver se a função foi chamada, se o valor tá certo, onde deu erro… e por aí vai. E tudo bem, é simples, direto e funciona.

Mas conforme os projetos crescem, os prints começam a virar uma bagunça. Chega uma hora que fica difícil saber o que é debug, o que é erro, o que é só informação, resumindo, entender qualquer coisa quando o sistema quebra em produção será uma tarefa árdua. Mas aí que entra uma solução bem mais interessante, nativa do próprio Python, o módulo logging.

Mas porque usar logging?

Se você já tentou depurar um problema em produção só com os prints do código, sabe como essa tarefa pode ser difícil. Prints não têm contexto, não têm níveis, não vão para lugar nenhum além do terminal, e o pior: não foram feitos pra isso.

O logging, por outro lado, é um sistema de registro de eventos muito mais completo e organizado. Ele permite classificar mensagens por níveis de importância, o que ajuda a entender rapidamente a gravidade de cada evento. Além disso, é possível salvar esses logs em arquivos ou enviá-los para serviços externos como sistemas de monitoramento. O logging também registra informações detalhadas, como o horário em que o evento ocorreu, o módulo responsável e até a linha de código onde a mensagem foi gerada, o que pode facilitar e muito na resolução de problemas.

import logging

logging.basicConfig(
    filename='meu_app.log',
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

logging.info("Esse log vai parar num arquivo!")
Enter fullscreen mode Exit fullscreen mode

Um aspecto interessante que esse módulo traz é o controle sobre quando e onde essas mensagens aparecem, o que permite, por exemplo, ter diferentes configurações de log para ambientes de desenvolvimento, testes e produção, permitindo registros mais úteis e contextuais para cada situação.

import logging

logging.basicConfig(level=logging.INFO)

logging.debug("Mensagem de debug")      # não será exibida devido nível mínimo ser info
logging.info("Mensagem de informação")
logging.warning("Alerta!")
logging.error("Erro aconteceu!")
logging.critical("Problema crítico!")
Enter fullscreen mode Exit fullscreen mode

Como integrar Logging nos seus projetos

Até aqui nós vimos como o logging funciona na teoria, mas de nada adianta sem saber como usar na prática, trarei um exemplo de uso em uma das grandes tecnologias usadas no ecossistema Python, o Django.

O Django já vem preparado para lidar com logs nativamente. A configuração é feita no settings.py, usando um dicionário que define formatadores, destinos e níveis.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'padrao': {
            'format': '[%(asctime)s] %(levelname)s %(name)s: %(message)s',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'padrao',
        },
    },
    'loggers': {
        'meu_app': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}
Enter fullscreen mode Exit fullscreen mode

Com essa configuração feita, o logging pode ser chamado nos seus apps, e ao chamar o método logging.getLogger('meu_app') ele buscará as os devidos formatadores e destinos que foram declarados no arquivo de configuração.

# signals.py
...
logger = logging.getLogger('meu_app')

@receiver(post_save, sender=User)
def enviar_email_boas_vindas(sender, instance, created, **kwargs):
    if not created:
        return  # só envia na criação

    try:
        send_mail(
            subject="Bem-vindo!",
            message=f"Olá {instance.username}, seja bem-vindo à plataforma!",
            from_email="noreply@meusite.com",
            recipient_list=[instance.email],
            fail_silently=False,
        )
        logger.info(f"E-mail de boas-vindas enviado para {instance.email}")
    except Exception as e:
        logger.exception(f"Erro ao enviar e-mail de boas-vindas para {instance.email}")
Enter fullscreen mode Exit fullscreen mode

Com isso, seguindo a formatação definida nas configurações o log registrado com esse signal seria assim:

[2025-07-28 13:47:12] INFO meu_app: E-mail de boas-vindas enviado para fulano@email.com
Enter fullscreen mode Exit fullscreen mode

Conclusão

O módulo logging parece simples, e é, mas simplicidade não é sinônimo de inutilidade. Ele te dá mais segurança, rastreabilidade e organização para lidar com qualquer aplicação que precise ser monitorada, analisada ou debugada de forma mais profissional. Não importa se você está construindo uma API, um sistema de filas, uma aplicação web ou mesmo scripts pontuais. Se você precisa saber o que está acontecendo, usar logging é o caminho natural.

Referências

logging — Logging facility for Python
logging in python
Logging - Django Documentation
How to configure and use logging- Django Documentation

Top comments (0)