2017-07-10 5 views
0

Ich habe folgende in meinem config.py setzen:Wie konfiguriert man die Protokollierung für alle Skripte im Projekt?

import time 
import logging 
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO) 
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') 
rootLogger = logging.getLogger() 
rootLogger.setLevel(logging.INFO) 

fileHandler = logging.FileHandler("{0}.log".format(time.strftime('%Y%m%d%H%M%S'))) 
fileHandler.setFormatter(logFormatter) 
rootLogger.addHandler(fileHandler) 

consoleHandler = logging.StreamHandler() 
consoleHandler.setFormatter(logFormatter) 
rootLogger.addHandler(consoleHandler) 

und dann bin ich

from config import * 

in alle meine Skripte und importierten Dateien zu tun.

Leider verursacht dies mehrere Protokolldateien erstellt.

Wie behebt man das? Ich würde zentralisiert config.py mit Protokollierung sowohl für die Konsole und Datei konfiguriert werden.

+0

Sie manuell in eine TXT-Datei anmelden kann mit 'mit open ('log.txt', 'a') als f: f.schreibe (Logging-Teil) 'und mache das für alle Skripte mit derselben log.txt-Datei. Und für die Konsole können Sie Druckanweisungen verwenden. –

+0

Ich möchte Zeitstempel drucken, mit Druck erfordert es wiederholende Codierung. – Dims

+0

@Dims machen es eine Funktion? – PYA

Antwort

1

Fall 1: Unabhängige Scripts/Programme

Im Fall sprechen wir über mehrere, voneinander unabhängige Skripte, die Protokollierung in der gleichen Art und Weise eingerichtet haben sollte: Ich würde sagen, jede unabhängige Anwendung ihre eigene haben sollte Log. Wenn Sie endgültig das nicht wollen, möchten Sie

haben
  • sicher, dass alle Anwendungen die gleichen Protokolldateinamen (zB eine Funktion in config.py erstellen, mit einem Parameter „Zeitstempel“, der bereitgestellt wird durch Ihr Skript (e)
  • gibt die appendfilemode for the fileHandler
  • sicher, dass config.py nicht zweimal irgendwo genannt wird, wie Sie die Protokollhandler zweimal hinzufügen würden, die in jeder Protokollmeldung gedruckt wird zweimal zur Folge hätte.

Fall 2:

config.py:

Eine große Anwendung, bestehend aus Modulen

Falls wir über eine große Anwendung sprechen, bestehend aus Modulen, können Sie eine Struktur wie die folgenden adoptieren

def set_up_logging(): 
    # your logging setup code 

Modul Beispiel (some_module.py):

import logging 

def some_function(): 
    logger = logging.getLogger(__name__) 

    [...] 

    logger.info('sample log') 

    [...] 

Haupt Beispiel (main.py)

import logging 
from config import set_up_logging 
from some_module import some_function 

def main(): 
    set_up_logging() 

    logger = logging.getLogger(__name__) 
    logger.info('Executing some function') 

    some_function() 

    logger.info('Finished') 

if __name__ == '__main__': 
    main() 

Erläuterung:

  • Mit dem Aufruf von set_up_logging() in main() können Sie Ihre Anwendungen Root-Logger konfigurieren
  • jedes Modul aus dem Haupt() aufgerufen wird, und seine Logger über logger = logging.getLogger(__name__) bekommen. Da sich die Modul-Logger in der Hierarchie unterhalb des Root-Loggers befinden, werden diese Loggings an den Root-Logger weitergegeben und von den Handlern des Root-Loggers verarbeitet.

Weitere Informationen finden Sie Pythons logging module doc und/oder die logging cookbook

Verwandte Themen