2017-07-10 1 views
0

J'ai mis ce qui suit dans mon config.py:Comment configurer la journalisation de tous les scripts dans le prject?

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) 

et je fais

from config import * 

dans tous mes scripts et fichiers importés.

Malheureusement, plusieurs fichiers journaux sont créés.

Comment résoudre ce problème? Je n'ai pas centralisé config.py avec la consignation configurée à la fois pour la console et le fichier.

+0

Vous pouvez les connecter manuellement à un fichier txt en utilisant 'avec open ('log.txt', 'a') comme f: f.write (partie de journalisation) 'et faites ceci pour tous les scripts avec le même fichier log.txt. Et pour la console, vous pouvez utiliser des instructions d'impression. –

+0

Je voudrais imprimer l'horodatage, avec l'impression il exigera le codage répétitif. – Dims

+0

@Dims en faire une fonction? – PYA

Répondre

1

Cas 1: Scripts indépendants/Programmes

Au cas où nous parlons de plusieurs, des scripts indépendants, qui devrait avoir l'enregistrement mis en place de la même manière: Je dirais que, chaque application indépendante devrait avoir son propre bûche. Si vous ne voulez pas définitivement, vous auriez à

  • assurez-vous que toutes les applications ont le même nom de fichier journal (par exemple, créer une fonction dans config.py, avec un paramètre « horodatage », qui est fourni par votre script (s)
  • spécifier le appendfilemode for the fileHandler
  • assurez-vous que config.py n'est pas appelé deux fois quelque part, comme vous ajouteriez les gestionnaires de journaux deux fois, ce qui se traduirait par chaque message de journal en cours d'impression à deux reprises.

Cas n ° 2: Une grosse application composée de modules

Au cas où nous parlons une grande application composée de modules, vous pouvez adopter une structure comme ce qui suit:

config.py:

def set_up_logging(): 
    # your logging setup code 

exemple de module (some_module.py):

import logging 

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

    [...] 

    logger.info('sample log') 

    [...] 

exemple principal (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() 

Explication:

  • Avec l'appel à set_up_logging() en main() vous configurez vos applications logger root
  • chaque module est appelée main(), et obtenez son enregistreur via logger = logging.getLogger(__name__). Comme l'enregistreur de modules se trouve dans la hiérarchie sous l'enregistreur racine, ces enregistrements sont «propagés» vers l'enregistreur racine et gérés par les gestionnaires de l'enregistreur racine.

Pour plus d'informations, voir Pythons logging module doc et/ou le logging cookbook