2010-12-14 5 views
23

Je semble rencontrer quelques problèmes lors de la tentative d'implémentation de la connexion dans mon projet python.Fichier de configuration de journalisation Python

Je suis tout simplement essayer d'imiter la configuration suivante:

Python Logging to Multiple Destinations

Cependant, au lieu de le faire à l'intérieur du code, je voudrais avoir dans un fichier de configuration.

Ci-dessous mon fichier de configuration:

[loggers] 
keys=root 

[logger_root] 
handlers=screen,file 

[formatters] 
keys=simple,complex 

[formatter_simple] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 

[formatter_complex] 
format=%(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s 

[handlers] 
keys=file,screen 

[handler_file] 
class=handlers.TimedRotatingFileHandler 
interval=midnight 
backupCount=5 
formatter=complex 
level=DEBUG 
args=('logs/testSuite.log',) 

[handler_screen] 
class=StreamHandler 
formatter=simple 
level=INFO 
args=(sys.stdout,) 

Le problème est que ma sortie de l'écran ressemble à:
2010-12-14 11: 39: 04066 - root - AVERTISSEMENT - 3
2010-12 -14 11: 39: 04066 - root - eRREUR - 4
2010-12-14 11: 39: 04066 - racine - CRITIQUE - 5

Mon fichier est sortie, mais il semble même que ci-dessus (même si la informations supplémentaires incluses). Toutefois, les niveaux de débogage et d'informations ne sont pas affichés non plus.

Je suis sur Python 2.7

Voici mon exemple simple montrant l'échec:

import os 
import sys 
import logging 
import logging.config 

sys.path.append(os.path.realpath("shared/")) 
sys.path.append(os.path.realpath("tests/")) 

class Main(object): 

    @staticmethod 
    def main(): 
    logging.config.fileConfig("logging.conf") 
    logging.debug("1") 
    logging.info("2") 
    logging.warn("3") 
    logging.error("4") 
    logging.critical("5") 

if __name__ == "__main__": 
    Main.main() 

Répondre

16

Il On dirait que vous avez défini les niveaux pour vos gestionnaires, mais pas votre enregistreur. Le niveau de l'enregistreur filtre chaque message avant qu'il puisse atteindre ses gestionnaires et la valeur par défaut est WARNING et au-dessus (comme vous pouvez le voir). Définir le niveau de l'enregistreur racine à NOTSET comme vous l'avez, ainsi que le définir à DEBUG (ou quel que soit le niveau le plus bas que vous souhaitez vous connecter) devrait résoudre votre problème.

11

ajoutant la ligne suivante à l'enregistreur de racine a pris soin de mon problème:

level=NOTSET 
0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import logging.handlers 
from logging.config import dictConfig 

logger = logging.getLogger(__name__) 

DEFAULT_LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
} 
def configure_logging(logfile_path): 
    """ 
    Initialize logging defaults for Project. 

    :param logfile_path: logfile used to the logfile 
    :type logfile_path: string 

    This function does: 

    - Assign INFO and DEBUG level to logger file handler and console handler 

    """ 
    dictConfig(DEFAULT_LOGGING) 

    default_formatter = logging.Formatter(
     "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s", 
     "%d/%m/%Y %H:%M:%S") 

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8') 
    file_handler.setLevel(logging.INFO) 

    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 

    file_handler.setFormatter(default_formatter) 
    console_handler.setFormatter(default_formatter) 

    logging.root.setLevel(logging.DEBUG) 
    logging.root.addHandler(file_handler) 
    logging.root.addHandler(console_handler) 



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module 

Je pense que vous devriez ajouter le disable_existing_loggers à false.

Questions connexes