日志处理器如何变成字符串?

1 投票
1 回答
2731 浏览
提问于 2025-04-16 06:12

我有一个日志记录器,它在脚本开始时正常工作,但在执行过程中出现了问题。看起来它的处理器被一个字符串覆盖了,但我找不到具体是在哪里发生的。

在脚本开始时,我打印了处理器和它的级别。以下代码:

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

是什么导致logger的处理器发生这样的变化呢?

1 个回答

0

这个字符串的内容可能会给你一些线索,告诉你出错的原因和方式。

我建议你在调用 info 之前加上:

print(repr(self.log.handlers))

在你调用 info 的地方之前:

self.log.info('%s %s%s%s', method, url, formstr, headerstr)

撰写回答