2017-12-11 8 views
1

Ich habe eine Funktion, die ich von Protokoll ausgeben möchte. Die Logdateien sind Teil der Programmausgabe als eine Aufzeichnung davon, wann die Funktion was gemacht hat (d. H. Nicht nur Debuggen oder Post-Mortem-Zeug), so dass ich sie an einem bestimmten Ort speichern möchte. Dieser Ort wird aus einer Konfigurationsdatei geladen, aber ich möchte Erfolg oder Misserfolg beim Lesen der Konfigurationsdatei protokollieren!Verzögern der Ausgabe zu einer Protokolldatei

So kann ich nicht das Logfile erstellen erst nach Config gelesen hatte, aber ich will nicht die Config bis lesen, nachdem ich den Prozess anmelden kann.

Gibt es eine Möglichkeit, eine Reihe von Protokollanweisungen zu verschieben, die erst später in die Datei geschrieben werden? Eine vereinfachte Version der Funktion ist unten: offensichtlich läuft es nicht, weil logfile erst später verfügbar ist.

Es sieht aus wie basicConfig(..., delay=True) die Antwort sein könnte, aber es klingt wie, dass nur eine Verzögerung für das erste Protokollierung Ereignis behandelt. Gibt es eine Antwort für mehr Logging-Ereignisse?

import logging 
import json 

def record(config): 

    logger = logging.getLogger(LOG) 
    logging.basicConfig(filename=logfile, level=logging.INFO) 
    logger.info('Start of continuous sampling') 

    # Load the config file 
    try: 
     config = json.load(open(config_file)) 
     logfile = config['logfile'] 
     logger.info('Config file found') 
    except IOError: 
     logger.critical('Config file not found') 
     sys.exit() 
+0

Bitte überprüfen Sie immer Ihre Eingabe, es ist nicht einfach zu folgen. Die "Verzögerung" ist wie ein Lazy Loading, es wird geschrieben, wenn Sie Ihren ersten Anruf bei 'info',' warn, ',' error' usw. machen. – user1767754

Antwort

0

Es gibt mehrere Optionen, aber hier sind zwei eher Einfältigen:

Option 1

starten in eine temporäre Datei zu protokollieren. Wenn Sie die Konfigurationsdatei syntaktisch analysieren konnten, kopieren Sie den Inhalt der temporären Datei und change the logging file handle. Wenn ein Fehler aufgetreten ist, speichern Sie die temporäre Datei als stdout.

Option 2

eine Wrapper-Klasse erstellen, die Anrufe an den Logger, solange die Config-Datei nicht verfügbar ist, verzögert. Etwas nach dem Vorbild von

class MyLogger(object): 
    def __init__(self, ...) 
    self.logger = ... # temp file 

    def info(self, msg): 
    self.logger.info(msg) 

    def changeLogfile(self, f): 
    self.logger = ... # now writing to f 

Sobald config['logfile'] verfügbar ist, rufen mylogger.changeLogfile() und Protokollierung fortzusetzen.

Verwandte Themen