gpt4 book ai didi

python - 自定义 python 数据库记录器,具有循环导入

转载 作者:行者123 更新时间:2023-11-30 23:40:42 26 4
gpt4 key购买 nike

我正在尝试创建自己的日志处理程序来记录到数据库模型,它扩展了logging.Handler

import logging
from logging import Handler
from logger.models import SearchLog

class DBHandler(Handler,object):
model = None
def __init__(self, model):
super(DBHandler, self).__init__()
mod = __import__(model)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
self.model = mod

def emit(self,record):
log_entry = self.model(level=record.levelname, message=record.msg)
log_entry.save()

这是日志配置:

'db_search_log':{
'level': 'INFO',
'class': 'db_logger.handlers.DBHandler',
'model': 'db_logger.models.SearchLog',
'formatter': 'verbose',
}

但是我收到以下错误,请参阅堆栈跟踪:

Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 252, in fetch_command
app_name = get_commands()[subcommand]
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 101, in get_commands
apps = settings.INSTALLED_APPS
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
self._setup()
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/conf/__init__.py", line 135, in __init__
logging_config_func(self.LOGGING)
File "/usr/lib/python2.7/logging/config.py", line 777, in dictConfig
dictConfigClass(config).configure()
File "/usr/lib/python2.7/logging/config.py", line 575, in configure
'%r: %s' % (name, e))
ValueError: Unable to configure handler 'db_search_log': Unable to configure handler 'db_search_log': 'module' object has no attribute 'handlers'

db_logger/                                                                                                                                                                                                
__init__.py
__init__.pyc
handlers.py
handlers.pyc
log_handlers.pyc
models.py
models.pyc
router.py
router.pyc
tests.py
views.py

感谢@istruble指出这是由于设置的循环导入造成的,我怎样才能避免它并仍然记录到数据库模型?

最佳答案

我刚刚想出了另一种更规范的方法来使用延迟导入来实现它,我最初的问题是尝试在 init 函数中导入模型:

from logging import Handler

class DBHandler(Handler,object):
model_name = None

def __init__(self, model=""):
super(DBHandler,self).__init__()
self.model_name = model

def emit(self,record):
# instantiate the model
try:
model = self.get_model(self.model_name)
except:
from logger.models import GeneralLog as model

log_entry = model(level=record.levelname, message=self.format(record))


log_entry.save()

def get_model(self, name):
names = name.split('.')
mod = __import__('.'.join(names[:-1]), fromlist=names[-1:])
return getattr(mod, names[-1])

关于python - 自定义 python 数据库记录器,具有循环导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com