python-多处理记录失败

时间:2019-03-29 05:57:17

标签: python python-2.7 logging multiprocessing

我正在尝试对我们的应用程序(烧瓶)进行多处理日志记录。我们使用python2.7,我使用队列的概念来保​​留来自队列中所有分叉的日志请求和日志记录。我遵循了这个approach。唯一的变化是我使用的是TimedRotatatingFileHandler而不是RotatingFileHandler。这是我的dictconfig

我在初始化fork之前以以下方式初始化记录器

    from flask import Flask
    from tornado.wsgi import WSGIContainer 
    from tornado.httpserver import HTTPServer
    from tornado.ioloop import IOLoop


    path = 'share/log_test/logging.yaml'
    if os.path.exists(path):
        with open(path, 'rt') as f:
            config = yaml.load(f.read())
        logging.config.dictConfig(config)

    logger = logging.getLogger('debuglog') # problem starts if i keep this statement

    app = Flask(__name__)
    init_routes(app) # initialize our routes
    server_conf = config_manager.load_config(key='server')
    logger.info("Logging is set up.") # only this line gets logged and other log statement to be logged by forks in code with same logger are not writing to the file.

    http_server = HTTPServer(WSGIContainer(app))

    http_server.bind(server_conf.get("PORT")) # port to listen
    http_server.start(server_conf.get("FORKS")) # number of forks
    IOLoop.current().start()

我面临的问题是,如果我在初始化fork之前在代码中使用getLogger,则fork不会将日志写入日志文件,而仅记录初始化fork之前的log语句。如果删除logging.getLogger('debuglog'),则分叉正确记录。

我暂停了执行流程,并验证了是否将处理程序分配给了记录器,但这似乎还可以

为什么会观察到这种奇怪的行为?

更新:当我使用另一个具有相同文件的记录器来编写并且一切正常时。但是,当我使用相同的记录器时,它不起作用。与RLock有关吗?

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。我在实现中删除了队列的概念,仅在接收到日志记录后立即打印,然后在那里打印。

    def emit(self, record):
        try:
            s = self._format_record(record)
            self._handler.emit(record) #emitting here itself
            # self.send(s) #stopped sending it to queue 
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

在以下测试中似乎可以正常工作

8 workers - 200 requests - 50 concurrency