2012-10-02 18 views
9

Me gustaría cancelar la nueva línea cuando lo hago, por ejemplo, log.info ("msg"). Cuando hacemos “imprimir” sólo¿Cómo puedo suprimir la nueva línea en el módulo de registro de Python?

print msg, 

así que necesito algo así como para el registro de coma.

siembro esta pregunta Suppress newline in Python logging module pero alguien me puede dar referencia o un ejemplo simple como “Hola mundo” Gracias!

+1

¿Desea concatenar varias entradas de registro? El problema es que las entradas de registro son como pedazos de papel separados. Mientras que la impresión sigue escribiendo en la misma hoja, el registro en realidad siempre comienza con uno nuevo. –

+2

He encontrado una solución aquí http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top Funciona para mí. – Maxim13

+0

En Python> = 3.2, se puede usar ['StreamHandler.terminate = '''] (https://docs.python.org/3/library/logging.handlers.html#streamhandler). – Ninjakannon

Respuesta

5

Esto no es posible (sin algunas intrusiones graves en el módulo de registro). Si debe tener esta funcionalidad, cree la cadena de registro en partes y conéctela cuando esté listo para mostrar un mensaje de registro con nueva línea.

5

Esto es lo que respondió por un similar question:

La nueva línea, \n, se inserta en el interior método emit(...) 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.

Espero que ayude.

Cuestiones relacionadas