Как обработчик ведения журнала становится str?

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

В начале скрипта я печатаю обработчик и его уровень. Следующий код:

print 'Array of handlers', logger.handlers
    for h in logger.handlers:
        print 'Handler', h
        print 'Handler level', h.level

производит это:

Array of handlers [<logging.FileHandler instance at 0x19ef320>]
Handler <logging.FileHandler instance at 0x19ef320>
Handler level 0

Теперь в середине выполнения вы увидите, что обработчик регистратора (hdlr) интерпретируется как str.

Started from <class 'mymodule.ext.freebase.HTTPMetawebSession'>.
Traceback (most recent call last):
  File "hadoop/get_web_data.py", line 144, in <module>
    main()
  File "hadoop/get_web_data.py", line 121, in main
    for count, performer in enumerate(results):
  File "/home/wraith/dev/modules/mymodule/ext/freebase.py", line 126, in mqlreaditer
    r = self._httpreq_json(service, 'POST', form=dict(query=qstr))
  File "/home/wraith/dev/modules/mymodule/contrib/freebase/api/session.py", line 369, in _httpreq_json
    resp, body = self._httpreq(*args, **kws)
  File "/home/wraith/dev/modules/mymodule/contrib/freebase/api/session.py", line 346, in _httpreq
    self.log.info('%s %s%s%s', method, url, formstr, headerstr)
  File "/usr/lib/python2.5/logging/__init__.py", line 985, in info
    apply(self._log, (INFO, msg, args), kwargs)
  File "/usr/lib/python2.5/logging/__init__.py", line 1101, in _log
    self.handle(record)
  File "/usr/lib/python2.5/logging/__init__.py", line 1111, in handle
    self.callHandlers(record)
  File "/usr/lib/python2.5/logging/__init__.py", line 1147, in callHandlers
    if record.levelno >= hdlr.level:
AttributeError: 'str' object has no attribute 'level'

В последних двух строках hdlr.level взрывается, потому что hdlr не является str.

if record.levelno >= hdlr.level:
AttributeError: 'str' object has no attribute 'level'

После установки обработчика в начале, что нормально, я не добавляю другой обработчик и не изменяю существующий каким-либо образом. Единственная команда, которую я вызываю для logger, это logger.info('event to log').

Что может изменить обработчик регистратора таким образом?


person Matt Norris    schedule 28.10.2010    source источник
comment
переопределить setattr в объекте журнала для печати трассировки стека, если обработчик является экземпляром базовой строки docs.python.org/reference/datamodel.html#object.__setattr__   -  person Spike Gronim    schedule 28.10.2010


Ответы (1)


Содержимое строки может дать вам представление о том, как и почему что-то идет не так.

я предлагаю поставить

print(repr(self.log.handlers))

прямо перед вашим звонком в info:

self.log.info('%s %s%s%s', method, url, formstr, headerstr)
person unutbu    schedule 28.10.2010
comment
Очень удобная команда - она ​​смогла привести меня прямо к ней. Спасибо! - person Matt Norris; 28.10.2010