web-dev-qa-db-fra.com

Python 2.4.3: configparror.nosectionError: Aucune section: 'Formatters'

Essayer d'utiliser un fichier de configuration de journalisation pour implémenter TimedRotatinigFileHandler.

Je ne prends tout simplement pas le fichier de configuration pour une raison quelconque.

Toute suggestion appréciée.


x.py:

import logging
import logging.config
import logging.handlers

logging.config.fileConfig("x.ini")

MyLog = logging.getLogger('x')

MyLog.debug('Starting') 

x.ini:

[loggers]
keys=root

[logger_root]
level=NOTSET
handlers=trfhand

[handlers]
keys=trfhand

[handler_trfhand]
class=handlers.TimedRotatingFileHandler
when=M
interval=1
backupCount=11
formatter=generic
level=DEBUG
args=('/var/log/x.log',)

[formatters]
keys=generic

[formatter_generic]
class=logging.Formatter
format=%(asctime)s %(levelname)s %(message)s
datefmt=

Traceback (most recent call last):
  File "x.py", line 5, in ?
    logging.config.fileConfig("x.ini")
  File "/usr/lib/python2.4/logging/config.py", line 76, in fileConfig
    flist = cp.get("formatters", "keys")
  File "/usr/lib/python2.4/ConfigParser.py", line 511, in get
    raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'formatters'

Merci

23
user981163

Le message d'erreur est strictement précis mais trompeur.

La raison pour laquelle la section "Formatters" est manquante, c'est parce que le module de journalisation ne peut pas trouver le fichier que vous avez passé à logging.config.fileConfig.

Essayez d'utiliser un chemin de fichier absolu.

74
ekhumoro

Oui, @ekhumoro avait raison. Il semble que logging _ attend un chemin absolu. Python équipe doit changer ce message d'erreur à quelque chose de plus lisible; il ne peut pas voir mon fichier, pas parce que le fichier de configuration lui-même est faux.

J'ai réussi à résoudre ceci en définissant un BASE_DIR Variable dans un fichier de configuration et importez-le comme préfixe du chemin, juste comme Django le fait. et N'oubliez pas de créer le ou les dir parents du fichier de journal s'ils ne sont pas créés.

Je définis le chemin et l'enregistreur en config.py:

import os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

import logging
import logging.config
logging.config.fileConfig(os.path.join(BASE_DIR, 'utils', 'logger.conf')) # the `logger.conf` locates under 'myproject/utils/'
logger = logging.getLogger("mylog") # 'mylog' should exist in `logger.conf` in the logger part

Dans d'autres modules:

from config import logger
...

logger.info("Your loggings modules should work now!! - WesternGun")
5
WesternGun