Custom Python Database Logger, Having Circular Import
I am trying to create my own log handler to log to db models, which extends logging.Handler import logging from logging import Handler from logger.models import SearchLog class DB
Solution 1:
I just came up with another actually more canonical way of implementing it using delayed imports, my original problem was trying to import the model inside init function:
from logging import Handler
classDBHandler(Handler,object):
model_name = Nonedef__init__(self, model=""):
super(DBHandler,self).__init__()
self.model_name = model
defemit(self,record):
# instantiate the modeltry:
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()
defget_model(self, name):
names = name.split('.')
mod = __import__('.'.join(names[:-1]), fromlist=names[-1:])
returngetattr(mod, names[-1])
Solution 2:
I got a work around and I admit it looks like a hack, which uses the model injection at actual logging point like this
from logging import Handler
classDBHandler(Handler,object):
def__init__(self):
super(DBHandler, self).__init__()
defemit(self,record):
model = record.model
log_entry = model(level=record.levelname, message=record.msg)
log_entry.save()
and you log it to the correct model by doing this:
import logging
import logger.models.TheModellogger= logging.getLogger(__name__)
logger.info(123, extra={'model':TheModel})
Post a Comment for "Custom Python Database Logger, Having Circular Import"