スクリプトの開始時に適切に機能し、途中で中断するロガーがあります。そのハンドラーが 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'
最後の 2 行では、 hdlrがstrではないため、 hdlr.levelが吹き飛ばされています。
if record.levelno >= hdlr.level:
AttributeError: 'str' object has no attribute 'level'
最初にハンドラーを設定した後は問題ありませんが、別のハンドラーを追加したり、既存のハンドラーを変更したりしません。ロガーで呼び出す唯一のコマンドはlogger.info('event to log')
.
このようにロガーのハンドラーを変更するのは何ですか?