¡Que tal aquí!
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.")
En caso de que vea demasiados registros de paquetes de terceros, asegúrese de ejecutar esta configuración logging.config.dictConfig(LOGGING_CONFIG)
antes de importar los paquetes de terceros.
Referencia: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
registrador: en el nivel superior del diccionario. Se describe en los documentos , tiene preferencia sobre['loggers']['']
cuándo ambos están presentes, pero en mi opinión,['loggers']['']
es más lógico. Vea también la discusión aquí'disable_existing_loggers': False
ya que tal vez no esté configurando todo el paño, pero tal vez reutilizando algo que ya está allí ... Si lo configura,True
entonces no parece que obtenga ningún resultado.format
desdeformatters
?¡La respuesta aceptada es buena! Pero, ¿y si uno pudiera comenzar con algo menos complejo? El módulo de registro es algo muy poderoso y la documentación es un poco abrumadora, especialmente para los novatos. Pero al principio no es necesario configurar formateadores y controladores. Puede agregarlo cuando descubra lo que quiere.
Por ejemplo:
fuente
logging.info('Hello, log')
que hizo que las cosas hicieran clic para mí. La confusión en la documentación es que con dictConfig ya no necesitamos realizargetLogger
ninguna de esas acciones.'': { 'level': 'INFO'...
y por qué no funciona sin ella (por ejemplo, al cambiar el valor en blanco a un valor válido comostandard
getLogger()
si desea varios registradores con diferentes nombres. Cada uno de estos registradores hereda la configuración del registrador raíz.getLogger
siempre es opcional. Cuando se usa ellogging.info()
método directamente, se usa el registrador raíz, mientras que congetLogger()
usted puede tener diferentes registradores, con diferentes nombres y niveles.Ejemplo con Stream Handler, File Handler, Rotating File Handler y SMTP Handler
fuente
He encontrado Django v1.11.15 configuración por defecto a continuación, espero que ayude
fuente
fuente