ylab color change python logging

color - python plotly axis



mensajes de registro que aparecen dos veces con el registro de Python (4)

Estoy usando el registro de Python, y por alguna razón, todos mis mensajes aparecen dos veces.

Tengo un módulo para configurar el registro:

# BUG: It''s outputting logging messages twice - not sure why - it''s not the propagate setting. def configure_logging(self, logging_file): self.logger = logging.getLogger("my_logger") self.logger.setLevel(logging.DEBUG) self.logger.propagate = 0 # Format for our loglines formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") # Setup console logging ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) # Setup file logging as well fh = logging.FileHandler(LOG_FILENAME) fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) self.logger.addHandler(fh)

Más tarde, llamo a este método para configurar el registro:

if __name__ == ''__main__'': tom = Boy() tom.configure_logging(LOG_FILENAME) tom.buy_ham()

Y luego, digamos, el módulo buy_ham, yo llamaría:

self.logger.info(''Successfully able to write to %s'' % path)

Y por alguna razón, todos los mensajes aparecen dos veces. Comenté uno de los controladores de flujo, sigue siendo la misma cosa. Un poco raro, no estoy seguro de por qué está sucediendo esto ... jaja. Asumiendo que me he perdido algo obvio.

Saludos, Victor


El controlador se agrega cada vez que llama desde afuera. Intente quitar el controlador después de terminar su trabajo:

self.logger.removeHandler(ch)


Está llamando a configure_logging dos veces (tal vez en el método __init__ de Boy ): getLogger devolverá el mismo objeto, pero addHandler no comprueba si ya se ha agregado un manejador similar al registrador.

Trate de rastrear llamadas a ese método y elimine uno de estos. O configure un indicador logging_initialized inicializado en False en el método __init__ de Boy y cambie configure_logging para no hacer nada si logging_initialized es True y para establecerlo en True después de haber inicializado el registrador.

Si su programa crea varias instancias Boy , tendrá que cambiar la forma de hacer las cosas con una función global configure_logging agregando los manejadores, y el método Boy.configure_logging solo inicializando el atributo self.logger .

Otra forma de resolver esto es verificando el atributo de manejadores de su registrador:

logger = logging.getLogger(''my_logger'') if not logger.handlers: # create the handlers and call logger.addHandler(logging_handler)


Si está viendo este problema y no está agregando el controlador dos veces, vea la respuesta de abarnert here

De los docs :

Nota: Si conecta un controlador a un registrador y uno o más de sus antecesores, puede emitir el mismo registro varias veces. En general, no debería necesitar conectar un controlador a más de un registrador; si solo lo conecta al registrador apropiado que está más alto en la jerarquía del registrador, verá todos los eventos registrados por todos los registradores descendentes, siempre que su propagación la configuración se deja en True. Un escenario común es adjuntar manejadores solo al registrador de raíz y dejar que la propagación se encargue del resto.

Por lo tanto, si desea un controlador personalizado en "prueba" y no desea que sus mensajes vayan también al controlador raíz, la respuesta es simple: apague su indicador de propagación:

logger.propagate = False


Soy un novato de Python, pero esto pareció funcionar para mí (Python 2.7)

while logger.handlers: logger.handlers.pop()