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?