web-dev-qa-db-fra.com

Fichier de configuration de la journalisation Python

Il semble que certains problèmes se posent lorsque je tente d'implémenter la connexion à mon projet python.

J'essaie simplement d'imiter la configuration suivante:

Journalisation Python vers plusieurs destinations

Cependant, au lieu de faire cela à l'intérieur du code, j'aimerais qu'il soit 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 d'écran ressemble à:
2010-12-14 11: 39: 04,066 - racine - AVERTISSEMENT - 3
2010-12-14 11: 39: 04,066 - racine - ERREUR - 4
2010-12-14 11: 39: 04,066 - racine - CRITIQUE - 5 

Mon fichier est en sortie, mais ressemble à ce qui précède (bien qu'avec les informations supplémentaires incluses). Cependant, les niveaux de débogage et d'information ne sont pas générés.

Je suis sur Python 2.7

Voici mon exemple simple montrant un é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 __== "__main__":
  Main.main()
29
Scott

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

20
bdeniker

L'ajout de la ligne suivante à l'enregistreur racine a résolu mon problème: 

level=NOTSET
12
Scott
#!/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.

1
wcc526

Ajoutez simplement le niveau de journalisation dans [logger_root]. C'est travaillé.

[logger_root]
level=DEBUG
handlers=screen,file
1
P113305A009D8M