2011-09-15 9 views
10

En mi proyecto actual hay miles de líneas de código que se parece a esto:Redefiniendo registrador raíz de la tala

logging.info("bla-bla-bla") 

no quiero cambiar todas estas líneas, pero me gustaría cambiar el comportamiento del registro. Mi idea está cambiando registrador de la raíz a la otra Experimental registrador, que se configura mediante el archivo ini:

[loggers] 
keys = Experimental 

[formatter_detailed] 
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s 

[handler_logfile] 
class = FileHandler 
args = ('experimental.log', 'a') 
formatter = detailed 

[logger_Experimental] 
level = DEBUG 
qualname = Experimental 
handlers = logfile 
propagate = 0 

Ahora fijar el nuevo registrador de la raíz se hace por este pedazo de código:

logging.config.fileConfig(path_to_logger_config) 
logging.root = logging.getLogger('Experimental') 

está redefiniendo del root logger seguro? Tal vez hay una manera más conveniente?

He intentado usar google y examiné las preguntas de stackoverflow, pero no encontré la respuesta.

+0

Primero. ¿Esto funcionó? ¿Tienes un problema real? Segundo. Definir "más conveniente" Dos líneas de código parecen muy convenientes. ¿Cuánto más conveniente puedes imaginar? –

+0

¡Funciona! Pero sospecho, esto parece un truco. "Más conveniente" significa: "usar alguna característica estándar del módulo de registro". Lo siento. –

+0

¡Buen hombre! El formateo es increíble. –

Respuesta

11

Se recomienda no para redefinir el registrador de raíz de la manera que usted describe. En general sólo se debe usar el registrador de la raíz directamente para pequeños scripts - para aplicaciones más grandes, la mejor práctica es utilizar

logger = logging.getLogger(__name__) 

en cada módulo donde se utiliza el registro, y luego hacer llamadas a logger.info(), etc.

Si todo lo que quiere hacer es iniciar sesión en un archivo, ¿por qué no simplemente agrega un manejador de archivos al registrador de raíz? Puede hacer uso, p.

if __name__ == '__main__': 
    logging.basicConfig(filename='experimental.log', filemode='w') 
    main() # or whatever your main entry point is called 

o mediante un archivo de configuración.

Actualización: Cuando digo "le aconsejan", me refiero a mi lado, aquí en esta respuesta ;-) bien no se puede ejecutar en cualquier problema en su escenario, no es una buena práctica para sobrescribir un módulo atributo que no ha sido diseñado para ser sobrescrito. Por ejemplo, el registrador de raíz es una instancia de una clase diferente (que no es parte de la API pública), y hay otras referencias a ella en la maquinaria de registro que aún señalaría el valor anterior. Cualquiera de estos hechos podría llevar a problemas difíciles de solucionar. Dado que el paquete de registro permite varias maneras de lograr lo que parece querer (aparentemente, iniciar sesión en un archivo en lugar de en la consola), entonces debe usar los mecanismos que se le proporcionaron.

+0

"Se te aconseja ..." ¿Dónde? ¿Cuál es el problema causado por esto? El resto de la respuesta "En general ..." es excelente.Pero esa primera oración se beneficiaría de alguna evidencia o documentación de respaldo. –

+0

'logging.root' es de la clase' logging.RootLogger', no 'logging.Logger'. Estas clases se comportan principalmente de la misma manera, pero puede encontrar un comportamiento diferente en algunos casos. Y algunos tipos de inspectores también podrían generar una advertencia. – DarksteelPenguin

1

logger = logging.getLogger() Dejar el nombre en blanco le devolverá el registrador de raíz.

logger = logging.getLogger('name') Le da otro registrador.

Cuestiones relacionadas