DEV Community

Cover image for Python Logging Formatters
DrxwHe4rt
DrxwHe4rt

Posted on

Python Logging Formatters

Esse artigo iremos aprender a formatar nossa mensagem de log e entregar uma experiencia melhor nesse quesito. Mas, primeiro vamos entender o que é um formatter.

  • Basicamente, eles configuram a ordem, a estrutura e o conteúdo finais da mensagem de log;
  • Se não houver formatação na mensagem, o padrão é usar a mensagem bruta;
  • Se não houver formatação na data, o formato de data padrão é: %Y-%m-%d %H:%M:%S;
  • A string de mensagem padrão é:
'%(asctime)s - %(levelname)s - %(message)s'
Enter fullscreen mode Exit fullscreen mode

Vamos ver isso em pratica...

Comece criando o arquivo .py, no meu caso, irá se chamar app.py, sinta-se a vontade para colocar o nome que desejar. Após criar o arquivo, iremos importar o módulo logging:

import logging
Enter fullscreen mode Exit fullscreen mode

Depois, vamos definir a nstancia do objeto getLogger():

logger = logging.getLogger()
Enter fullscreen mode Exit fullscreen mode

E o nivel de criticidade do objeto:

logger.setLevel(logging.DEBUG)
Enter fullscreen mode Exit fullscreen mode

Agora, chegamos no ponto em que gostariamos. É o momento de definir o nosso formatador:

formatter = logging.Formatter(
    '%(asctime)s:%(levelname)s:%(message)s'
)
Enter fullscreen mode Exit fullscreen mode

Vamos utilizar a formatação padrão e ao decorrer do artigo vamos implementando essa colocação.

Apenas para método de praticidade, iremos utilizar o modo StreamHandler (visto no artigo anterior), dessa forma o log ficará somente no terminal e não salvará em nenhum arquivo:

sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
Enter fullscreen mode Exit fullscreen mode

Vamos finalizar nosso código dizendo ao módulo logging qual o nosso formatador, utilizando a função setFormatter:

sh.setFormatter(formatter)
Enter fullscreen mode Exit fullscreen mode

Adicione uma simples mensagem para que nosso script gere um log a partir dela:

logger.debug('Olá.')
Enter fullscreen mode Exit fullscreen mode

execute o nosso script:

python app.py
Enter fullscreen mode Exit fullscreen mode

A saida deverá ser algo parecido com isso:
2

Vamos agora, dizer ao nosso formatador que queremos que ele mostre qual arquivo gerou o log. Para isso, implementaremos o seguinte parametro a nossa string: %(filename)s.

# sua variavel formatter deverá ficar dessa forma:
formatter = logging.Formatter(
    '%(asctime)s:%(levelname)s:%(filename)s:%(message)s'
)
Enter fullscreen mode Exit fullscreen mode

Execute outra vez o script:

python app.py
Enter fullscreen mode Exit fullscreen mode

O retorno será esse:
Captura de tela_2021-01-13_19-06-24

Pensando bem, essa data esta meio confusa, não esta?
Que tal se formatássemos a data então?
Veja:

  • a função Formatter contém uma variavel chamada datefmt, podemos usar ela para formatar a nossa data/hora e retornar algo mais user friendly. Dito isso, mudaremos o conteúdo da nossa variavel formatter adicionando o parametro datefmt da seguinte forma:
formatter = logging.Formatter(
    '%(asctime)s:%(levelname)s:%(filename)s:%(message)s',

    # Padrão de data: dia/mes/ano 
    # Padrão de hora: hora/minuto/segundos 
    # Sistema (am/pm)
    datefmt='%d/%m/%Y %I:%M:%S %p'
)
Enter fullscreen mode Exit fullscreen mode

Execute o script e o seu resultado será esse:
3

Você pode embelezar um pouco mais sua string formatadora e deixa-la da seguinte forma:

formatter = logging.Formatter(
    'Data/Hora: %(asctime)s | level: %(levelname)s | file: %(filename)s | mensagem: %(message)s',

    # Padrão de data: dia/mes/ano 
    # Padrão de hora: hora/minuto/segundos 
    # Sistema (am/pm)
    datefmt='%d/%m/%Y %H:%M:%S %p'
)
Enter fullscreen mode Exit fullscreen mode

Tendo como resultado:
4

Conclusão

Vimos nesse artigo que podemos formatar nossa log e deixa-lo mais amigável para quem for lê-lo (normalmente, será um desenvolvedor). Lendo a documentação você irá perceber que existem outras formas de realizar essa formatação, mas procurei um jeito mais didático de mostrar como se faz.

Latest comments (0)