write values multiple logger log files example disable_existing_loggers python logging

values - ¿Cómo escribir el manejador de registro de python personalizado?



python logging multiple files (1)

import logging class ProgressConsoleHandler(logging.StreamHandler): """ A handler class which allows the cursor to stay on one line for selected messages """ on_same_line = False def emit(self, record): try: msg = self.format(record) stream = self.stream same_line = hasattr(record, ''same_line'') if self.on_same_line and not same_line: stream.write(self.terminator) stream.write(msg) if same_line: stream.write(''... '') self.on_same_line = True else: stream.write(self.terminator) self.on_same_line = False self.flush() except (KeyboardInterrupt, SystemExit): raise except: self.handleError(record) if __name__ == ''__main__'': import time progress = ProgressConsoleHandler() console = logging.StreamHandler() logger = logging.getLogger(''test'') logger.setLevel(logging.DEBUG) logger.addHandler(progress) logger.info(''test1'') for i in range(3): logger.info(''remaining %d seconds'', i, extra={''same_line'':True}) time.sleep(1) logger.info(''test2'')

Tenga en cuenta que solo se está registrando un controlador y el argumento de la palabra clave extra para que el controlador sepa que debe permanecer en una línea. Hay más lógica en el método emit() para manejar los cambios entre los mensajes que deben permanecer en una línea y los mensajes que necesitan tener su propia línea.

Cómo escribir la función de registro de la consola personalizada para que se muestre solo en los mensajes de registro de la ventana de la consola en una sola línea (no adjuntar) hasta el primer registro de registro normal.

progress = ProgressConsoleHandler() console = logging.StreamHandler() logger = logging.getLogger(''test'') logger.setLevel(logging.DEBUG) logger.addHandler(console) logger.addHandler(progress) logger.info(''test1'') for i in range(3): logger.progress(''remaining %d seconds'' % i) time.sleep(1) logger.info(''test2'')

Para que la salida de la consola sea de solo tres líneas:

INFO: test1 remaining 0 seconds... INFO: test2

¿Alguna sugerencia sobre la mejor manera de cómo implementar esto?