为什么我会收到这样的错误消息:我的自定义日志处理程序“没有属性`level`”?

2024-05-16 09:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下处理程序:

import logging 
from peewee import * 

db = SqliteDatabase("my_app.db") 

class Log(Model): 
    message = CharField() 
    class Meta: 
        database = db 

Log.create_table(db) 

class DatabaseHandler(logging.Handler): 
    def emit(self, record): 
        try: 
            event = Log( 
                message=record.message 
            ) 
            event.save() 

        except Exception: 
            self.handleError(record)

当我这样做的时候:

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(DatabaseHandler)
logger.info("something")   

我收到以下错误消息:

Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
  File "/home/raf/miniconda3/lib/python3.7/logging/__init__.py", line 1383, in info
    self._log(INFO, msg, args, **kwargs)
  File "/home/raf/miniconda3/lib/python3.7/logging/__init__.py", line 1519, in _log
    self.handle(record)
  File "/home/raf/miniconda3/lib/python3.7/logging/__init__.py", line 1529, in handle
    self.callHandlers(record)
  File "/home/raf/miniconda3/lib/python3.7/logging/__init__.py", line 1590, in callHandlers
    if record.levelno >= hdlr.level:
AttributeError: type object 'DatabaseHandler' has no attribute 'level'

我只能在另一个地方(https://github.com/GNS3/gns3-gui/issues/2109)找到这个错误,它没有解决方案

这可能是因为我写的处理程序不正确,如果有人能帮助我,我将不胜感激


Tags: inpyselfhomedbinitliblogging
2条回答

据我所知,您正在尝试在DatabaseHandler中继承Handler对象

官方文件指出: 请注意,处理程序从不直接实例化;此类充当更有用子类的基础。但是,子类中的init()方法需要调用处理程序。init() 据我所知,您应该初始化类中的处理程序

正如@polar_bear正确指出的那样,DatabaseHandler需要在传递给addHandler之前进行实例化。另一个问题是当您应该访问record.msgsomeone found this here)时访问record.message

以下是更正后的代码:

import logging 
from peewee import * 

db = SqliteDatabase("my_app.db") 

class Log(Model): 
    message = CharField() 
    class Meta: 
        database = db 

Log.create_table(db) 

class DatabaseHandler(logging.Handler): 
    def emit(self, record): 
      try: 
          event = Log( 
              message=record.msg
          ) 
          event.save() 

      except Exception: 
          self.handleError(record)

dh = DatabaseHandler()

logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 
logger.addHandler(dh)
logger.info("something")

相关问题 更多 >