Que tal aqui!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
Uso:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
Caso você veja muitos logs de pacotes de terceiros, execute esta configuração usando logging.config.dictConfig(LOGGING_CONFIG)
antes importar os pacotes de terceiros.
Referência: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
criador de logs: no nível superior do dicionário. É descrito nos documentos , tem preferência sobre['loggers']['']
quando ambos estão presentes, mas na minha opinião,['loggers']['']
é mais lógico. Veja também a discussão aqui'disable_existing_loggers': False
, pois talvez você não esteja configurando todo o pano, mas talvez reutilizando algo que já está lá. Se você configurá-lo paraTrue
isso, parece que não recebo nenhuma saída.format
partirformatters
?A resposta aceita é legal! Mas e se alguém pudesse começar com algo menos complexo? O módulo de registro é algo muito poderoso e a documentação é um pouco impressionante, especialmente para iniciantes. Mas, para o começo, você não precisa configurar formatadores e manipuladores. Você pode adicioná-lo quando descobrir o que deseja.
Por exemplo:
fonte
logging.info('Hello, log')
que fez as coisas clicarem para mim. A confusão na documentação é que, com o dictConfig, não precisamos mais executargetLogger
nenhuma dessas ações.'': { 'level': 'INFO'...
e por que ele não funciona sem ele (por exemplo, ao alterar o valor em branco para um valor válido comostandard
getLogger()
se você quiser vários registradores com nomes diferentes. Cada um desses registradores herda a configuração do registrador raiz.getLogger
é sempre opcional. Ao usar ologging.info()
método diretamente, o registrador raiz é usado, enquantogetLogger()
você pode ter registradores diferentes, com nomes e níveis diferentes.Exemplo com manipulador de fluxo, manipulador de arquivos, manipulador de arquivo rotativo e manipulador SMTP
fonte
Encontrei a configuração padrão do Django v1.11.15 abaixo, espero que ajude
fonte
fonte