使用Python的日志模块记录错误的问题
我正在用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 个回答
8
检查一下你是否定义了与标准模块同名的模块。如果有名字冲突的话,可能会导致问题。下面这个稍微修改过的脚本在我的系统上运行没有错误。你可以试试在你的系统上运行,如果没问题的话,再仔细检查一下你是否重新定义了同样名字的类。
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()
顺便说一下 - 我知道你没有问这个,但不推荐把日志记录器存储为实例变量,因为这样做没有意义,反正它们都是单例。大多数用户的正常做法是在模块级别创建一个日志记录器,并在整个模块中使用它。如果你需要更细致的记录,可以创建一个子日志记录器,用__name__
作为前缀(例如'%s.detail' % __name__
)
logger = logging.getLogger(__name__)