2012-10-02 13 views
9

Desidero annullare newline quando eseguo ad esempio log.info ("msg"). Quando facciamo “stampa” è soloCome posso sopprimere newline nel modulo di registrazione Python.

print msg, 

quindi ho bisogno di qualcosa di simile a coma per la registrazione.

semino questa domanda Suppress newline in Python logging module ma qualcuno mi può dare di riferimento o un semplice esempio del tipo “Ciao mondo” Grazie!

+1

Quindi si desidera concatenare più voci di registro? Il problema è che le voci di registro sono come pezzi di carta separati. Mentre la stampa continua a scrivere sullo stesso foglio, il log inizia sempre con uno nuovo. –

+2

Ho trovato la soluzione qui http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top Funziona per me. – Maxim13

+0

In Python> = 3.2, si può usare ['StreamHandler.terminate = ''] (https://docs.python.org/3/library/logging.handlers.html#streamhandler). – Ninjakannon

risposta

5

Questo non è possibile (senza un serio hacking nel modulo di registrazione). Se è necessario disporre di questa funzionalità, creare la stringa di registrazione in parti e registrarla quando si è pronti a visualizzare un messaggio di registro con newline.

5

Ecco cosa ho risposto per un similar question:

La nuova linea, \n, è inserito all'interno metodo emit(...) della classe StreamHandler.

Se sei veramente impostato su fissaggio questo comportamento, allora ecco un esempio di come ho risolto questo monkey patching il metodo emit(self, record) all'interno della classe logging.StreamHandler.

Una patch di scimmia è un modo per estendere o modificare il codice di runtime delle lingue dinamiche senza alterare il codice sorgente originale. Questo processo è stato definito anche punzonatura d'anatra.

Ecco l'implementazione personalizzata di emit() che omette interruzioni di riga:

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) 

allora si sarebbe fare una classe di registrazione personalizzata (in questo caso, sottoclasse da 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) 

Qualcuno potrebbe sostenere che questo tipo di soluzione non è Pythonic, o qualsiasi altra cosa. Potrebbe essere così, quindi stai attento.

Inoltre, si tenga presente che questo patch a livello globale è SteamHandler.emit(...), quindi se si utilizzano più classi di registrazione, questa patch influirà anche sulle altre classi di registrazione!

Spero che questo aiuti.

Problemi correlati