Python Logging Formatters
Tags: python, logging, programming, linux
Published: 2021-01-14 15:50:01

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 é: 
```python 
'%(asctime)s - %(levelname)s - %(message)s'
```

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*:

```python
import logging
```

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

```python
logger = logging.getLogger()
```
E o nivel de criticidade do objeto:

```python
logger.setLevel(logging.DEBUG)
```
Agora, chegamos no ponto em que gostariamos. É o momento de definir o nosso formatador:

```python
formatter = logging.Formatter(
    '%(asctime)s:%(levelname)s:%(message)s'
)
```
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 <a href="">artigo anterior</a>), dessa forma o log ficará somente no terminal e não salvará em nenhum arquivo:

```python
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
```

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

```python
sh.setFormatter(formatter)
```

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

```python
logger.debug('Olá.')
```

execute o nosso script:

```sh
python app.py
```

A saida deverá ser algo parecido com isso:
![2](https://dev-to-uploads.s3.amazonaws.com/i/d5sckp63sdec41orbyqh.png)

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*.

```python
# sua variavel formatter deverá ficar dessa forma:
formatter = logging.Formatter(
    '%(asctime)s:%(levelname)s:%(filename)s:%(message)s'
)
```

Execute outra vez o script:

```sh
python app.py
```
 O retorno será esse:
![Captura de tela_2021-01-13_19-06-24](https://dev-to-uploads.s3.amazonaws.com/i/mjncse7gjq5ofbffvwt7.png)

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:

 ```python
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'
)
```

Execute o script e o seu resultado será esse:
![3](https://dev-to-uploads.s3.amazonaws.com/i/67yhpbra3woeykwllcjo.png)
 
Você pode embelezar um pouco mais sua string formatadora e deixa-la da seguinte forma:

```python
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'
)
```

Tendo como resultado:
![4](https://dev-to-uploads.s3.amazonaws.com/i/d8x88chmqgfqtry69tc5.png)
 
## 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.