web-dev-qa-db-fra.com

La journalisation python vide-t-elle tous les journaux?

Lorsque j'écris un journal dans un fichier à l'aide du module standard logging, chaque journal sera-t-il vidé sur le disque séparément? Par exemple, le code suivant videra-t-il le journal 10 fois?

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

si oui, va-t-il ralentir?

52
Vincent Xue

Oui, il vide la sortie à chaque appel. Vous pouvez le voir dans le code source du StreamHandler:

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)

Je ne me soucierais pas vraiment des performances de la journalisation, du moins pas avant de profiler et de découvrir qu'il s'agit d'un goulot d'étranglement. Quoi qu'il en soit, vous pouvez toujours créer une sous-classe Handler qui n'exécute pas flush à chaque appel à emit (même si vous risquez de perdre beaucoup de journaux si une mauvaise exception se produit/l'interprète plante).

55
Bakuriu