2013-05-19 6 views
38

Wenn ich ein Protokoll in Datei mit dem Standardmodul Protokollierung schreibe, wird jedes Protokoll getrennt auf Platte gespeichert? Zum Beispiel, wird der folgende Code 10 Mal loggen?Spült python Protokollierung jedes Protokoll?

logging.basicConfig(level=logging.DEBUG, filename='debug.log') 
    for i in xrange(10): 
     logging.debug("test") 

wenn ja, wird es verlangsamen?

Antwort

44

Ja, es spült den Ausgang bei jedem Anruf. Sie können für die StreamHandler diese im Quellcode sehen:

def flush(self): 
    """ 
    Flushes the stream. 
    """ 
    self.acquire() 
    try: 
     if self.stream and hasattr(self.stream, "flush"): 
      self.stream.flush() 
    finally: 
     self.release() 

def emit(self, record): 
    """ 
    Emit a record. 

    If a formatter is specified, it is used to format the record. 
    The record is then written to the stream with a trailing newline. If 
    exception information is present, it is formatted using 
    traceback.print_exception and appended to the stream. If the stream 
    has an 'encoding' attribute, it is used to determine how to do the 
    output to the stream. 
    """ 
    try: 
     msg = self.format(record) 
     stream = self.stream 
     stream.write(msg) 
     stream.write(self.terminator) 
     self.flush() # <--- 
    except (KeyboardInterrupt, SystemExit): #pragma: no cover 
     raise 
    except: 
     self.handleError(record) 

ich nicht wirklich über die Leistung der Protokollierung dagegen hätte, zumindest nicht vor dem Profilieren und entdeckt, dass es zu einem Engpass ist. Wie auch immer, Sie können immer eine Handler Unterklasse erstellen, die flush bei jedem Aufruf von emit nicht ausführt (obwohl Sie riskieren, viele Protokolle zu verlieren, wenn eine schlechte Ausnahme auftritt/der Interpreter abstürzt).

+1

Ist 'flush()' Methode nicht von der [Vorgängerklasse] (https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers) mit leerem Körper? Ist 'flush()' Methode für 'StreamHandler()' es zu überschreiben? – akhan

+1

@akhan [Ja.] (Https://hg.python.org/cpython/file/3.5/Lib/logging/__init__.py#l958) – Bakuriu

Verwandte Themen