Registro de Python solo registro desde script

Estoy usando el módulo de registro de Python en un simple script mío con la siguiente configuración en este momento.

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') logger = logging.getLogger(__name__) 

Mi problema es que esto también detecta los módulos de terceros, como las solicitudes y la información de salida (), los mensajes de registro de ellos. ¿Hay alguna forma de suprimir estos mensajes o decirle al módulo de registro solo que registre los mensajes desde mi propio script?

Usando registradores nombrados en sus módulos:

 import logging logger = logging.getLogger(__name__) logger.info("my info") logger.error("my error") 

puede establecer el nivel de registro para todos los demás registradores en error y para que sus registradores debug:

 import logging logging.basicConfig(level=logging.ERROR) logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 

La respuesta anterior no es realmente correcta, solo establecerá una barra más alta para que se muestren los mensajes de otros módulos.

Un enfoque muy rápido sería utilizar este código:

 import logging.config logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': True, }) 

Debe configurar esto después de importar todos los módulos; deshabilitará todos los registradores que se crearon hasta este momento. Esto funcionará la mayor parte del tiempo, pero algunos módulos crean su registrador cuando creas una instancia de clase, por ejemplo (lo que sucedería más adelante en tu código).


Cuando configuras los registradores de acuerdo con el tutorial básico de Python, te dicen que uses logging.basicConfig(...) . Esto es un problema, ya que esto establecerá el controlador (también conocido como a donde se enrutará el registro) a logging.lastResort que es stderr comenzando con Python 3.2 para todos los registradores en el proceso. Esto significa que ahora ha habilitado el registro completo para todos los módulos.

Por lo tanto, un mejor enfoque es crear un registrador diferente solo para sus módulos y asignarle algunos controladores propios en lugar de usar basicConfig() .

Hay dos maneras de hacer eso:

1) Todas las funciones:

 import logging log = logging.getLogger(__name__) log.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d - %H:%M:%S") ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) fh = logging.FileHandler("mylog.log", "w") fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) log.addHandler(ch) log.addHandler(fh) 

Esto le dará el registro del registrador que luego puede usar como log.error("Error found") . Se escribirá en un nuevo archivo llamado mylog.log y también se registrará para que sys.stdout. Puedes cambiar esto como quieras, por supuesto.

2) Usando un dict:

 import logging import logging.config DEFAULT_LOGGING = { 'version': 1, 'formatters': { 'standard': { 'format': '%(asctime)s %(levelname)s: %(message)s', 'datefmt': '%Y-%m-%d - %H:%M:%S' }, }, 'handlers': { 'console': {'class': 'logging.StreamHandler', 'formatter': "standard", 'level': 'DEBUG', 'stream': sys.stdout}, 'file': {'class': 'logging.FileHandler', 'formatter': "standard", 'level': 'DEBUG', 'filename': 'live_detector.log','mode': 'w'} }, 'loggers': { __name__: {'level': 'INFO', 'handlers': ['console', 'file'], 'propagate': False }, } } logging.config.dictConfig(DEFAULT_LOGGING) log = logging.getLogger(__name__) 

Esto dará el mismo resultado que el anterior, un poco más, pero tal vez más fácil de leer. Esto también automáticamente establecerá 'disable_existing_loggers': True . Si no desea eso, debe agregarlo y configurarlo en Falso.