Ошибка регистрации ошибок с модулем регистрации Python - PullRequest
3 голосов
/ 03 декабря 2010

Я регистрирую ошибку с помощью модуля регистрации Python. Я сделал объект логгера внутри своего класса следующим образом:

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

, когда я пытаюсь зарегистрировать ошибку позже в коде, как:

self.my_logger.error("My error")

тогда я получаю ошибку:

AttributeError: FileHandler instance has no attribute 'filters'

Более подробный журнал ошибок:

  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'

Перед этим, вот как я устанавливаю обработчик файла:

 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.")

Есть идеи, что здесь происходит? спасибо.

1 Ответ

7 голосов
/ 04 декабря 2010

Убедитесь, что вы не определили модули, чьи имена конфликтуют со стандартными. Слегка измененный скрипт ниже работает на моей системе без ошибок. Попробуйте на своем, и если это работает, дважды проверьте, что вы не переопределяете классы с одинаковыми именами.

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()

Кстати - я знаю, что вы не спрашивали об этом, но не рекомендуется хранить регистраторы в качестве переменных экземпляра - нет никакого смысла, так как они в любом случае одиночные. Обычный подход для большинства пользователей - иметь один

logger = logging.getLogger(__name__)

на уровне модуля, и используйте его во всем модуле. Если вам нужна дополнительная детализация, создайте дочерний регистратор регистратора, используя __name__ в качестве префикса (например, '%s.detail' % __name__)

...