2012-10-02 19 views
9

Ich möchte Newline abbrechen, wenn ich zum Beispiel log.info ("msg") mache. Wenn wir „Druck“ tun es nurWie kann ich Newline in Python-Logging-Modul unterdrücken.

print msg, 

Also brauche ich so etwas wie Koma für die Protokollierung.

Ich säe diese Frage Suppress newline in Python logging module aber jemand mir Referenz oder ein einfaches Beispiel, wie „Hallo Welt“ Dank kann!

+1

Sie möchten also mehrere Protokolleinträge verketten? Das Problem besteht darin, dass Protokolleinträge wie einzelne Zettel aussehen. Während der Druck auf demselben Blatt fortfährt, beginnt das Protokoll immer mit einem neuen, neuen. –

+2

Ich habe hier eine Lösung gefunden http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top Es funktioniert für mich. – Maxim13

+0

In Python> = 3.2 kann man ['StreamHandler.terminate = '''] (https://docs.python.org/3/library/logging.handlers.html#streamhandler) verwenden. – Ninjakannon

Antwort

5

Dies ist nicht möglich (ohne ernsthaftes Hacking in das Logging-Modul). Wenn Sie über diese Funktionalität verfügen müssen, erstellen Sie die Protokollierungszeichenfolge in Teilen, und melden Sie sich an, wenn Sie eine Protokollnachricht mit Zeilenumbruch anzeigen möchten.

5

Hier ist, was ich für ein similar question antwortete:

Die neue Linie, \n, ist im Innern der emit(...) Methode der eingesetzten StreamHandler Klasse.

Wenn Sie wirklich sind eingestellt auf Festsetzung dieses Verhalten, dann ist hier ein Beispiel, wie ich dieses Problem gelöst durch monkey patching die emit(self, record) Methode innerhalb der Klasse logging.StreamHandler.

Ein Affe-Patch ist eine Möglichkeit, den Laufzeitcode dynamischer Sprachen zu erweitern oder zu ändern, ohne den ursprünglichen Quellcode zu ändern. Dieser Prozess wurde auch als Entenstanzen bezeichnet.

Hier ist die kundenspezifische Implementierung von emit(), die Zeilenumbrüche auslässt:

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) 

Dann würden Sie eine benutzerdefinierte Protokollierung Klasse machen (in diesem Fall Subklassen von 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) 

Einige Leute könnten argumentieren, dass diese Art der Lösung nicht Pythonic, oder was auch immer ist. Es könnte so sein, also sei vorsichtig.

Beachten Sie auch, dass dies global SteamHandler.emit(...) patchen wird. Wenn Sie also mehrere Protokollierungsklassen verwenden, wirkt sich dieser Patch auch auf die anderen Protokollierungsklassen aus!

Hoffe, dass hilft.

Verwandte Themen