使用Python的日志记录模块记录错误
发布时间:2020-12-20 11:16:09 所属栏目:Python 来源:网络整理
导读:我正在使用 python的日志记录模块记录错误.我在我的课程中创建了一个logger对象,如下所示: self.my_logger = logging.getLogger('my_logger')self.my_logger.setLevel(logging.ERROR) 当我尝试在代码中稍后记录错误时,如下所示: self.my_logger.error("My
我正在使用
python的日志记录模块记录错误.我在我的课程中创建了一个logger对象,如下所示:
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.") 知道这里发生了什么吗?谢谢. 解决方法
检查您是否未定义任何名称与标准名称冲突的模块.下面稍加修改的脚本在我的系统上运行而没有错误.尝试使用它,如果它有效,请仔细检查您是否重新定义了具有相同名称的任何类.
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() 顺便说一下 – 我知道你没有问过这个问题,但是不建议将记录器存储为实例变量 – 没有意义,因为他们无论如何都是单身人士.大多数用户的正常方法是拥有一个 logger = logging.getLogger(__name__) 在模块级别,并在整个模块中使用它.如果您需要更多粒度,请使用__name__作为前缀创建记录器的子记录器(例如’%s.detail’%__name__) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |