2010-12-03 7 views
1

Je consigne une erreur dans le module de journalisation de Python. J'ai fait un objet enregistreur dans ma classe, comme suit:Problèmes de journalisation avec le module de journalisation de Python

self.my_logger = logging.getLogger('my_logger') 
self.my_logger.setLevel(logging.ERROR) 

quand je tente de me connecter une erreur plus tard dans le code, comme:

self.my_logger.error("My error") 

puis-je obtenir l'erreur:

AttributeError: FileHandler instance has no attribute 'filters' 

L'erreur plus détaillée journal est:

File "/lib/python2.6/logging/__init__.py", line 1047, in error 
    self._log(ERROR, msg, args, **kwargs) 
    File "/lib/python2.6/logging/__init__.py", line 1129, in _log 
    self.handle(record) 
    File "/lib/python2.6/logging/__init__.py", line 1139, in handle 
    self.callHandlers(record) 
    File "/lib/python2.6/logging/__init__.py", line 1176, in callHandlers 
    hdlr.handle(record) 
    File "/lib/python2.6/logging/__init__.py", line 658, in handle 
    rv = self.filter(record) 
    File "/lib/python2.6/logging/__init__.py", line 558, in filter 
    for f in self.filters: 
AttributeError: FileHandler instance has no attribute 'filters' 

En amont de cela, voici comment je configurer le gestionnaire de fichiers:

if self.log_dir != None: 
    self.log_filename = os.path.join(self.log_dir, 'run.%s' \ 
            %(time.strftime("%m-%d-%y_%H:%M:%S"))) 

ch_file = logging.FileHandler(self.log_filename, 
            delay=True) 
ch_file.setLevel(logging.ERROR) 
ch_file.setFormatter(formatter) 
self.my_logger.addHandler(ch_file) 

ch_stream = logging.StreamHandler() 
ch_stream.setLevel(logging.INFO) 

# add formatter to ch 
ch_stream.setFormatter(formatter) 

# add ch to logger 
self.my_logger.addHandler(ch_stream) 
self.my_logger.info("Ready.") 

Toute idée de ce qui se passe ici? Merci.

+0

Quelque chose est arrivé avec la façon dont vous avez ajouté des gestionnaires à un enregistreur plus haut dans la hiérarchie de l'enregistreur, vraisemblablement pour l'enregistreur racine. Pourriez-vous nous montrer ce code d'installation aussi? –

+0

Il semble que le problème réside dans le FileHandler. Pouvez-vous poster votre config FileHandler? –

+0

l'a postée en publication. Merci – user248237dfsf

Répondre

5

Vérifiez que vous n'avez défini aucun module dont les noms ne correspondent pas aux noms standard. Le script légèrement modifié ci-dessous fonctionne sur mon système sans erreur. Essayez-le sur le vôtre et si cela fonctionne, vérifiez que vous ne redéfinissez pas les classes portant le même nom.

import logging 
import os 
import time 

class SomeClass: 
    def __init__(self): 
     self.log_dir = os.getcwd() 
     formatter = logging.Formatter('%(asctime)s %(message)s') 
     self.my_logger = logging.getLogger('my_logger') 
     self.my_logger.setLevel(logging.INFO) 

     if self.log_dir != None: 
      self.log_filename = os.path.join(self.log_dir, 'run.log') 

     ch_file = logging.FileHandler(self.log_filename, 'w') 
     ch_file.setLevel(logging.ERROR) 
     ch_file.setFormatter(formatter) 
     self.my_logger.addHandler(ch_file) 

     ch_stream = logging.StreamHandler() 
     ch_stream.setLevel(logging.INFO) 

     # add formatter to ch 
     ch_stream.setFormatter(formatter) 

     # add ch to logger 
     self.my_logger.addHandler(ch_stream) 
     self.my_logger.info("Ready.") 

     self.my_logger.error("My error") 


def main(): 
    SomeClass() 

if __name__ == '__main__': 
    main() 

Par ailleurs - je sais que vous n'avez pas demandé à ce sujet, mais il n'est pas recommandé la pratique de stocker des enregistreurs comme variables d'instance - il n'y a pas de point, car ils sont singletons de toute façon. L'approche normale pour la plupart des utilisateurs est d'avoir un seul

logger = logging.getLogger(__name__) 

au niveau du module, et l'utiliser tout au long du module. Si vous avez besoin de plus de granularité, créez un enregistreur enfant de l'enregistreur en utilisant __name__ comme préfixe (par exemple '%s.detail' % __name__)

Questions connexes