Python, ведение журнала: использовать пользовательский обработчик с настройкой словаря? - PullRequest
7 голосов
/ 18 марта 2011

это модуль логирования в Python 3.2 (GNU / Linux x86_64): возможно ли установить пользовательский обработчик с конфигурацией словаря? Это код, который я пытаюсь:

import logging
import logging.config

class CustomHandler(logging.StreamHandler):
    pass

logconfig = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'CustomHandler',
        }
    },
    'loggers': {
        'custom': {
            'handlers': ['console'],
        }
    }
}
logging.config.dictConfig(logconfig)
logger = logging.getLogger('custom')
logger.error('Error message')

Что, конечно, не работает. Это вывод:

Traceback (most recent call last):
  File "/usr/lib/python3.2/logging/config.py", line 390, in resolve
    found = self.importer(used)
ImportError: No module named CustomHandler

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.2/logging/config.py", line 569, in configure
    handler = self.configure_handler(handlers[name])
  File "/usr/lib/python3.2/logging/config.py", line 698, in configure_handler
    klass = self.resolve(config.pop('class'))
  File "/usr/lib/python3.2/logging/config.py", line 403, in resolve
    raise v
  File "/usr/lib/python3.2/logging/config.py", line 390, in resolve
    found = self.importer(used)
ValueError: Cannot resolve 'CustomHandler': No module named CustomHandler

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./prova.py", line 91, in <module>
    logging.config.dictConfig(logconfig)
  File "/usr/lib/python3.2/logging/config.py", line 777, in dictConfig
    dictConfigClass(config).configure()
  File "/usr/lib/python3.2/logging/config.py", line 574, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'console': Cannot resolve 'CustomHandler': No module named CustomHandler

В источнике есть метод importer, который я действительно не понимаю ... Есть идеи?

Спасибо!

1 Ответ

13 голосов
/ 18 марта 2011

Вы должны указать ему, где найти класс CustomHandler. Строка должна содержать модуль (и, возможно, пакет), где он может быть найден. Если вы запускаете этот скрипт напрямую, вы можете использовать __main__.CustomHandler. В противном случае используйте your_module.CustomHandler, где вы заменяете your_module на имя модуля, содержащего класс.

...