Protokollierung in zwei Dateien mit unterschiedlichen Einstellungen


79

Ich verwende bereits eine grundlegende Protokollierungskonfiguration, bei der alle Nachrichten über alle Module hinweg in einer einzigen Datei gespeichert werden. Jetzt brauche ich jedoch eine komplexere Lösung:

  • Zwei Dateien: Die erste bleibt gleich.
  • Die zweite Datei sollte ein benutzerdefiniertes Format haben.

Ich habe die Dokumente für das Modul gelesen, aber sie sind im Moment für mich sehr komplex. Holzfäller, Handler ...

Kurz gesagt:

So melden Sie sich in Python 3 bei zwei Dateien an:

import logging
# ...
logging.file1.info('Write this to file 1')
logging.file2.info('Write this to file 2')

Antworten:


145

Sie können so etwas tun:

import logging
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')


def setup_logger(name, log_file, level=logging.INFO):
    """To setup as many loggers as you want"""

    handler = logging.FileHandler(log_file)        
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')

1
Die Standardprotokollstufe ist logging.WARNING, daher ist es klarer, wenn Logger.setLevel(logging.WARNING)aufgerufen wird.
Zeekvfu

1
Warum wird meine logger_1Datei nicht in eine Protokolldatei ausgegeben? Ich habe eingestellt logger_1.error('error foo'), aber immer noch nicht funktioniert
Gank

Kombinieren des Kommentars von @zeekvfu und der Frage von @Gank ... Wenn Sie die logger_1.info('message_1')Zeile in sehen möchten simplefile_1.log, müssen Sie entweder die Ebene auf " INFOVerwenden" logger_1.setLevel(logging.INFO)oder "Verwenden" einstellen logger_1.error('message_1'). Eine INFONachricht wird anscheinend nicht protokolliert, wenn die Ebene WARNINGaktiviert ist. Dies ist die Standardeinstellung.
dnlbrky

hat die Antwort bearbeitet. Setzen Sie die Datei logger_1.info auf logger_1.warning. Auf diese Weise muss der Pegel nicht eingestellt werden.
user1812076

1
@ eos87 Sind logger_1 und logger_2 global? Dh ich kann sie in jeder Funktion verwenden? Wenn nicht, ist es eine gute Idee, sie in der def-Hauptfunktion global zu machen? Wenn ja, wie würden Sie vorgehen?
Dnaiel

18
def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    


setup_logger('log1', txtName+"txt")
setup_logger('log2', txtName+"small.txt")
logger_1 = logging.getLogger('log1')
logger_2 = logging.getLogger('log2')




logger_1.info('111messasage 1')
logger_2.info('222ersaror foo')

1
Sind logger_1 und logger_2 global? Dh ich kann sie in jeder Funktion verwenden? Wenn nicht, ist es eine gute Idee, sie in der def-Hauptfunktion global zu machen? Wenn ja, wie würden Sie vorgehen?
Dnaiel

Sie würden das nicht in der Def tun, Sie würden das tun, wo immer Sie Ihre Logger definieren.
Alex R

1
Würde dies nicht zu doppelten Konsolenausgaben führen?
Erol
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.