2011-08-23 14 views
22

Estoy tratando de reemplazar un sistema de registro ad-hoc con el módulo de registro de Python. Estoy usando el sistema de registro para generar información de progreso para una tarea larga en una sola línea para que pueda tail el registro o verlo en una consola. Lo he hecho con un indicador en mi función de registro que suprime la nueva línea para ese mensaje de registro y crea la línea pieza por pieza.Suprimir la nueva línea en el módulo de registro de Python

Todo el registro se realiza desde un solo hilo, por lo que no hay problemas de serialización.

¿Es posible hacer esto con el módulo de registro de Python? ¿Es una buena idea?

+0

Si desea registrar varias cosas en la misma línea, considere no usar 'logging' pero use un buen objeto antiguo y escriba directamente (y en un archivo diferente del archivo de registro utilizado para otros, basado en líneas) , cosas). – ThiefMaster

+0

@ThiefMaster Estoy escribiendo en un archivo y stdout directamente en este momento. Sin embargo, siento que estoy reescribiendo el registro, así que prefiero usar el registro si resulta ser menos esfuerzo. –

Respuesta

8

Comencemos con su última pregunta: No, no creo que sea una buena idea. IMO, perjudica la legibilidad del archivo de registro en el largo plazo.

Sugiero seguir con el módulo logging y usar la opción '-f' en su comando 'cola' para ver la salida desde la consola. Probablemente terminará usando el FileHandler. Observe que el argumento predeterminado para 'delay' es False, lo que significa que la salida no se almacenará en búfer.

Si necesita realmente para suprimir las nuevas líneas, le recomendaría crear su propio controlador.

12

La nueva línea, \n, se inserta dentro de la clase StreamHandler.

Si realmente fijan en fijación de este comportamiento, entonces aquí es un ejemplo de cómo resolví esto mediante el método monkey patchingemit(self, record) dentro de la clase logging.StreamHandler.

Un parche mono es una forma de ampliar o modificar el código de tiempo de lenguajes dinámicos sin alterar el código fuente original. Este proceso también se ha denominado perforación de patos.

Aquí está la implementación personalizada de emit() que omite los saltos de línea:

def customEmit(self, record): 
    # Monkey patch Emit function to avoid new lines between records 
    try: 
     msg = self.format(record) 
     if not hasattr(types, "UnicodeType"): #if no unicode support... 
      self.stream.write(msg) 
     else: 
      try: 
       if getattr(self.stream, 'encoding', None) is not None: 
        self.stream.write(msg.encode(self.stream.encoding)) 
       else: 
        self.stream.write(msg) 
      except UnicodeError: 
       self.stream.write(msg.encode("UTF-8")) 
     self.flush() 
    except (KeyboardInterrupt, SystemExit): 
     raise 
    except: 
     self.handleError(record) 

allí tendría que hacer una clase de registro personalizado (en este caso, la subclasificación de TimedRotatingFileHandler).

class SniffLogHandler(TimedRotatingFileHandler): 
    def __init__(self, filename, when, interval, backupCount=0, 
       encoding=None, delay=0, utc=0): 

     # Monkey patch 'emit' method 
     setattr(StreamHandler, StreamHandler.emit.__name__, customEmit) 

     TimedRotatingFileHandler.__init__(self, filename, when, interval, 
              backupCount, encoding, delay, utc) 

Algunas personas podrían argumentar que este tipo de solución no es Pythonic, o lo que sea. Puede ser así, así que ten cuidado.

Además, tenga en cuenta que esto parcheará globalmente SteamHandler.emit(...), por lo que si está utilizando varias clases de registro, entonces este parche también afectará a las otras clases de registro.

Consultar estas para la lectura adicional:

Espero que ayude.

20

Si desea hacer esto, puede cambiar el terminador del controlador de registro. Estoy usando Python 3.4. Esto fue introducido en Python 3.2 según lo declarado por Ninjakannon.

handler = logging.StreamHandler() 
handler.terminator = "" 

Cuando el StreamHandler lo escribe, escribe el terminador al final.

+11

Esto fue [introducido en Python 3.2] (https://docs.python.org/3/library/logging.handlers.html#streamhandler). – Ninjakannon

Cuestiones relacionadas