如何在项目中保留记录器设置

时间:2015-09-18 10:36:00

标签: python django logging celery

我在我的django应用程序中添加了一个自定义日志记录处理程序,用于将日志条目写入数据库。

class DbLogHandler(logging.Handler): # Inherit from logging.Handler
    def __init__(self):
        # run the regular Handler __init__
        logging.Handler.__init__(self)
        self.entries = []
        logging.debug("*****************[DB] INIT db handler")

    def emit(self, record):
        # instantiate the model
        logging.debug("*****************[DB] called emit on db handler")
        try:
            revision_instance = getattr(record, 'revision', None)
            logEntry = MyModel(name=record.name,
                                  log_level_name=record.levelname,
                                  message = record.msg,
                                  module = record.module,
                                  func_name = record.funcName,
                                  line_no = record.lineno,
                                  exception = record.exc_text,
                                  revision = revision_instance
                                  )
            if revision_instance is None:
                return
            self.entries.append(logEntry)

        except Exception as ex:
            print(ex)
        return

    def flush(self):
        if self.entries:
            MyModel.objects.bulk_create(self.entries)
            logging.info("[+] Successfully flushed {0:d} log entries to "
                         "the DB".format(len(self.entries)))
        else:
            logging.info("[*] No log entries for DB logger")

我将此处理程序显式添加到我的芹菜日志中,如下所示:

my_app.celery_logging.logger

from celery.utils.log import get_task_logger

class CeleryAdapter(logging.LoggerAdapter):
    """Adapter to add current task context to "extra" log fields."""
    def process(self, msg, kwargs):
        if not celery.current_task:
            return msg, kwargs

        kwargs = kwargs.copy()
        kwargs.setdefault('extra', {})['celery'] = \
            vars(celery.current_task.request)
        return msg, kwargs

def task_logger(name):
    """
    """
    # first get the default celery task logger
    log = get_task_logger(name)

    # if available, add the db handler explicitly to the celery task
    # logger
    handlers = settings.LOGGING.get('handlers', [])
    if handlers:

        db_handler_dict = handlers.get('db', None)

        db_handler_dict.pop('class', None)
        loglevel = db_handler_dict.pop('level', None)
        db_handler = DbLogHandler()
        if loglevel:
            db_handler.setLevel(loglevel)
        formatter = Formatter(BASIC_FORMAT)
        db_handler.setFormatter(formatter)
        log.addHandler(db_handler)

    # wrap the logger by the CeleryAdapter to add some celery specific
    # context to the logs
    return CeleryAdapter(log, {})

但是一旦超出@task的范围,db-loghandler就不再被拾取了。如何在全球范围内建立记录器设置?

0 个答案:

没有答案