Lib para criar logs em formato JSON, com suporte a FluentD.
Esta lib utiliza o logging nativo do Python, sobrescrevendo seu output para formato JSON, para uso com FluentD e/ou outras ferramentas de consumo de log em JSON.
Através dela, também é possivel incluir tags personalizadas ao JSON de forma fácil e intuitiva.
Adicionar ao requirements.txt
do projeto:
git+https://github.com/douglasmoraisdev/json_log#egg=json_log
OU manualmente com PIP:
$ pip install git+https://github.com/douglasmoraisdev/json_log#egg=json_log
A Lib utiliza o arquivo config.yml
para sua configuração. As mesmas podem ser encontradas no arquivo 'sample.config.yml', e consumidas via arquivo .env, se for o padrão do projeto.
LOG_FLUENTD: true #true: utiliza as configuracoes de FluentD a seguir #false: utiliza log em arquivo
LOG_FLUENTD_HOST: localhost #host do FluentD, se utilizado
LOG_FLUENTD_PORT: 24224 #porta do FluentD, se utilizado
LOG_LEVEL: INFO #Nivel de log
LOG_NAME: teste_log #Nome do arquivo de log, caso não use FluentD
LOG_LOCAL_PATH: log/ #Path do log, caso não use FluentD
Para utilizar o log basta importar o objeto applog
da package e utilizar os metodos de logging (info, debug, error, etc).
- message(required, positional): Texto da mensagem do log
- **campos personalizados(optional): Parametros nomeados que serão incluidos no log. Ver a sessão
Tags e campos personalizadas
para mais informações.
Exemplo:
from json_log import applog
if __name__ == '__main__':
applog.info('Alguma mensagem de log nivel INFO')
applog.debug('Alguma mensagem de log nivel DEBUG')
Irá resultar em:
{
"@timestamp": "2020-05-12 14:08:40,657",
"appname": "teste_log",
"loglevel": "INFO",
"run_id": "470e25bc-7e5d-4af8-b71a-2e22d582cc5a",
"message": "Alguma mensagem de log nivel INFO"
}
{
"@timestamp": "2020-05-12 14:08:40,657",
"appname": "teste_log",
"loglevel": "DEBUG",
"run_id": "470e25bc-7e5d-4af8-b71a-2e22d582cc5a",
"message": "Alguma mensagem de log nivel DEBUG"
}
- Obs.: O exemplo desse output em JSON está identado para melhor visualização nesta documentação. O output normal, não é identado, e sim um registro por linha.
É possivel o envio de tags e campos personalizadas para o log. Basta passar como argumento nomeado(kwargs) na chamada do log.
Tags e campos personalizados são úteis para a ferramenta de log que irá consumir o JSON. Com estes campos é possivel facilitar o parse e consulta destes logs de forma flexivel, como por exemplo, filtrando todos os logs que contem a tag
'x' ou 'y'.
Exemplo:
applog.error('Alguma mensagem de log nivel ERRO', algum_campo_personalizado='algum_valor_util', tags=['erro', 'processamento_x', 'outra_tag'])
Output:
{
"@timestamp": "2020-05-12 14:24:35,667",
"appname": "teste_log",
"loglevel": "ERROR",
"run_id": "2f15f1b0-c9d4-48fb-8cbd-7abcda7380dc",
"algum_campo_personalizado": "algum_valor_util",
"tags": [
"erro",
"processamento_x",
"outra_tag"
],
"message": "Alguma mensagem de log nivel ERRO"
}
- Note o nó algum_campo_personalizado e tags.
Alguns metodos da classe de log foram criados para situações especiais, para facilitar seu uso e tem outputs com campos extras de informação.
Loga o tempo total de uma execução. Adiciona a tag metrics
no log.
message(required): Texto da mensagem do log
func_name(required): Nome da função cronometrada
total_time(required): Tempo total de execução
**kwargs(optional): campos personalizados
Exemplo:
applog.time_metric('Executada funcao_x', 'funcao_x', 4)
Output:
{
"@timestamp": "2020-05-12 14:42:48,258",
"appname": "teste_log",
"loglevel": "INFO",
"run_id": "b0d19656-0dbe-4c35-aa4f-d3b1c11b3b44",
"message": "Executada funcao_x",
"total_time": 4,
"function_name": "funcao_x",
"tags": [
"metrics"
]
}
- Obs.: Os
campos personalizados
continuam tendo o mesmo funcionamento.