首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python何时调用logging.Handler刷新方法?

python何时调用logging.Handler刷新方法?
EN

Stack Overflow用户
提问于 2015-09-18 21:22:56
回答 1查看 506关注 0票数 2

这是我的自定义日志记录处理程序

代码语言:javascript
复制
import logging
import datetime

from my_app.models import MyModel


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

    def emit(self, record):
        # instantiate the model
        print("@@@@@@@@@@@@@@@@@@@@", self.__hash__())
        print("*****************[DB] called emit on db handler")
        print("*****************[DB] entries has {0:d} entries "
                     "now".format(len(self.entries)))
        # print("*****************[DB] current record is {}".format(record.__dict__))
        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)
            print("[+] entries has {0:d} entries "
                         "now".format(len(self.entries)))

        except Exception as ex:
            print(ex)
        return

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

我的日志文件告诉我

代码语言:javascript
复制
[2015-09-18 15:12:51,367: WARNING/Worker-2] [+] entries has 3 entries now
[2015-09-18 15:12:51,366: DEBUG/Worker-2] threedi_inpy.tasks.generate_inp_files[None]: {}
[2015-09-18 15:12:51,367: WARNING/Worker-2] @@@@@@@@@@@@@@@@@@@@
[2015-09-18 15:12:51,367: WARNING/Worker-2] 6865789
[2015-09-18 15:12:51,367: WARNING/Worker-2] *****************[DB] called emit on db handler
[2015-09-18 15:12:51,367: WARNING/Worker-2] *****************[DB] entries has 3 entries now
[2015-09-18 15:12:51,367: WARNING/Worker-2] [+] entries has 4 entries now
[2015-09-18 15:12:51,367: INFO/Worker-2] threedi_inpy.tasks.generate_inp_files[None]: [*] Trying to make_sqlite_models_entry for now
[2015-09-18 15:12:51,368: WARNING/Worker-2] @@@@@@@@@@@@@@@@@@@@
[2015-09-18 15:12:51,368: WARNING/Worker-2] 5511201
[2015-09-18 15:12:51,368: WARNING/Worker-2] *****************[DB] called emit on db handler
[2015-09-18 15:12:51,368: WARNING/Worker-2] *****************[DB] entries has 0 entries now
[2015-09-18 15:12:51,368: INFO/Worker-2] threedi_inpy.tasks.generate_inp_files[None]: Skipped directory /srv/var/models/lars_test/test9967b6-52ee-11e5-940c-0050569e25test92/.hg
[2015-09-18 15:12:51,368: WARNING/Worker-2] @@@@@@@@@@@@@@@@@@@@
[2015-09-18 15:12:51,369: WARNING/Worker-2] 5511201
[2015-09-18 15:12:51,369: WARNING/Worker-2] *****************[DB] called emit on db handler
[2015-09-18 15:12:51,369: WARNING/Worker-2] *****************[DB] entries has 0 entries now

永远不会调用flush方法,因此我的条目将丢失。因此,我的第一个问题是:何时调用flush()?或者,我如何批量写入数据库,而不是每次发出?

EN

回答 1

Stack Overflow用户

发布于 2019-10-07 22:41:44

您基本上是在尝试编写MemoryHandler

它是一个处理程序,它将在内存中存储记录,并在达到最大容量或记录特定级别时调用flush。然后,flush会将记录发送到target处理程序,该处理程序可能是您的数据库处理程序。

flush确实没有在基础处理程序中调用,它只是在应用程序接口中定义的,它由子类决定如何以及是否调用它。唯一调用它的情况是当调用logging.shutdown时。

例如,MemoryHandler在emit (从BufferingHandler继承)中执行此操作:

代码语言:javascript
复制
    def emit(self, record):
    """
    Emit a record.

    Append the record. If shouldFlush() tells us to, call flush() to process
    the buffer.
    """
    self.buffer.append(record)
    if self.shouldFlush(record):
        self.flush()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32653144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档