2010-06-25 18 views
39

Cómo escribir la función de registro de la consola personalizada para mostrar 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.Cómo escribir el controlador de registro de python personalizado?

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 sólo tres líneas:

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

alguna sugerencia sobre la mejor manera de cómo implementar esta?

+0

¿Dónde se define 'log'? ... aparte del 'log' en' matemática' ... –

+0

La mayoría de estos debería ser de ayuda: http://stackoverflow.com/search?q=python+logging+handler –

+0

posible duplicado de [Redirigir la salida de registro mediante el uso personalizado gestor de registro] (http://stackoverflow.com/questions/2819791/redirect-logging-output-using-custom-logging-handler) –

Respuesta

45
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') 

en cuenta que se está registrando un solo controlador, y el argumento extra palabra clave para permitir que el controlador sabe 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.

+9

FYI para quienes se encuentran con esto: el atributo 'terminator' solo está disponible en Python> = 3.2, ver https://mail.python.org/pipermail/python-list/2010-October/590223.html – Pat

Cuestiones relacionadas