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()
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.
L'ajout de la ligne suivante à l'enregistreur racine a résolu mon problème:
level=NOTSET
#!/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.
Ajoutez simplement le niveau de journalisation dans [logger_root]
. C'est travaillé.
[logger_root]
level=DEBUG
handlers=screen,file