Skip to content Skip to sidebar Skip to footer

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"