Python Logging Config
Tags: python, programming, linux, logging
Published: 2021-01-16 02:17:36

Caso tenha você tenha começado a ler esse artigo e esta se perguntado "que diabos é logging?", deixo aqui os artigos anteriores para que fique por dentro (é de extrema importancia que leia os artigos anteriores a esse, para que tenha maior compreensão do que iremos fazer aqui).

1. <a href="https://dev.to/wendrewdevelop/gerando-logs-com-python-25k4">Amostragem generalizada sobre logging, em python</a>

2.  <a href="https://dev.to/wendrewdevelop/logging-handlers-55j8">Handlers</a>

3. <a href="https://dev.to/wendrewdevelop/python-logging-formatters-fld">Formatters</a>

E a parte 4 dessa serie de artigos sobre logging será esse que você esta lendo, onde iremos parametrizar todas as configurações de nosso logging em um arquivo especifico, para que fique tudo organizado.

Para começar, crie uma pasta na qual ira comportar os itens desse artigo, dê o nome que preferir a ela e após isso crie um arquivo *app.py* (dê o nome que preferir também).

Comece importando nosso modo de logs:

```python
import logging
```
Por enquanto vamos deixar o arquivo *app.py* dessa forma e vamos criar outro arquivo chamado *config.ini* (também sinta-se a vontade para escolher o nome que desejar). É nesse arquivo que iremos adicionar nossas configurações.

Para que você entenda brevemente do que se trata, o arquivo com extensão *.ini* é divido em sessões que possuem propriedades, é muito útil para arquivos de configuração que não necessitam de muita complexidade. Segue a formatação de um arquivo de configuração desse tipo:

```ini
; Isso é um comentario

; As propriedades basicas de um arquivo desse tipo são as propriedades e essas contém um nome e um valor
nome=valor

; O arquivo, também pode ser divido por sessões, para que fique melhor organizado
[sessão]
nome=valor
```

Dito tudo isso, podemos começar a configurar o arquivo do nosso sistema de logs. Dentro do arquivo que criamos, vamos adicionar as seguintes sessões e propriedade:

```ini
[loggers]
; Por padrão o logger root ja é chamado pelo módulo logging, mas iremos deixar isso explicito
keys = root

[handlers]
; Aqui definimos o modo como nosso log irá operar
keys = FileHandler

[formatters]
; E aqui será o nosso formatador
; O formatador também ficara dentro desse arquivo
keys = simpleFormatter

; Aqui definiremos as configurações do nosso logger root
[logger_root]
; Indicamos o level de DEBUG apenas
level = DEBUG
; Especificamos o nome do logger que iremos atuar
qualname = root
; E dizemos que será um logger de arquivo
handlers = FileHandler

; propriedades do nosso arquivo de log
[handler_FileHandler]
; Especificamos a nossa classe
class = FileHandler
; O formatador
formatter = simpleFormatter
; Aqui definimos o nome e o modo de escrita 
args = ('LOG.log', 'w')
; write / w = sobrescreve o arquivo sempre que gera um log novo
; append / a (padrão) = agrupa todos os logs sem apagar o anterior

; Por ultimo, mas não menos importante
; Definiremos como irá atuar nossa string de formatação
[formatter_simpleFormatter]
format = Data/Hora: %(asctime)s | level: %(levelname)s | file: %(filename)s | mensagem: %(message)s
```

Como pode ver, deixei tudo comentado conforme fui decorrendo o arquivo, acredito que ficará mais facil de compreender, ao inves de dividir a explicação por partes.

Com o arquivo de configuração pronto, vamos voltar a *app.py* e terminar de escrever nosso codigo. Nós tinhamos acabado de importar nosso módulo, então vamos dar continuidade implementando as seguintes linhas:

```python
# Além de importar o módulo logging
# Iremos importar outro modulo, chamado config
import logging.config

# Logo abaixo definiremos o arquivo de configuração
logging.config.fileConfig('config.ini')
```

**Para um breve entendimento...**

Ao importarmos *logging.config* abrimos um leque de possibilidades, quando se trata de configurações de log. Dentre o métodos de configuração, escolhemos o  *fileConfig* ja que estamos trabalhando com um arquivo de configuração, mas o módulo carrega com si outras opções, como *dictConfig* que obtém a configuração de log atravéz de um dicionário, contamos também com a opção *listen* que inicia um servidor de soquete na porta especificada e escuta as novas configurações.

Dito isso, vamos finalizar nosso script adicionando as seguintes linhas:

```python
# definido a instancia do objeto getLogger()
logger = logging.getLogger()
# Gerando log
logger.info('teste')
```

Nosso arquivo *app.py* completo ficará assim:

```python
import logging
# Além de importar o módulo logging
# Iremos importar outro módulo, chamado config
import logging.config

# Logo abaixo definiremos o arquivo de configuração
logging.config.fileConfig('config.ini')

# definido a instancia do objeto getLogger()
logger = logging.getLogger()
# Gerando log
logger.info('teste')
```

Agora, podemos executar nosso codigo. Digite no terminal:

```sh
python app.py
```

Após rodar o script, veremos que foi gerado o arquivo *LOG.log* com a seguinte mensagem dentro:

```log
Data/Hora: 2021-01-14 12:39:34,687 | level: INFO | file: app.py | mensagem: teste
```

## Conclusão ##

Talvez, esse artigo tenha ficado maior do que os anteriores e um pouco mais maçante, mas isso foi necessário para que obtivéssemos um melhor entendimento do que fizemos. Agora você ja conseguirá criar um gerador de logs mais "encorpado" e mais facil de ser mantido futuramente, pois segue a ideia da documentação oficial.