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()