如何在rotatefilehandler中查看文件名更改?

时间:2018-04-17 05:23:16

标签: python logging

我使用gunicorn运行我的烧瓶app的2个过程。 我使用filerotatingfilehandler来旋转日志文件。 问题是当一个进程旋转日志文件,另一个进程不知道,然后它再次旋转文件(现在名为log.txt.1)(到log.txt.2,并可能更改log.txt log.txt.1)。然后,一个进程登录log.txt,而另一个进程登录log.txt.1。 我知道我可以使用watchedfilehandler + logrotate来解决问题。 但我仍然可以使用rotatefilehandler并检测文件名更改吗?

1 个答案:

答案 0 :(得分:0)

您可以使用分布式全局锁来防止双重旋转,例如this example gist

但是,我建议在Flask应用中像这样使用WatchedFileHandler

from celery.signals import after_setup_logger
from logging import ERROR, Formatter
from logging.handlers import WatchedFileHandler
from yourapp import app


LOG_FORMAT = (
    '-' * 80 + '\n' +
    '%(levelname)s in %(module)s [%(pathname)s:%(lineno)d]:\n' +
    '%(message)s\n' +
    '-' * 80
)


if not app.config['DEBUG']:
    error_handler = WatchedFileHandler(app.config['ERROR_HANDLER_LOG'], delay=True)
    error_handler.setFormatter(Formatter(LOG_FORMAT))
    error_handler.setLevel(ERROR)

    @after_setup_logger.connect
    def after_setup_logger(logger, *args, **kwargs):
        logger.addHandler(error_handler)

    @app.before_first_request
    def before_first_request():
        app.logger.addHandler(error_handler)

然后使用cron脚本或文件监视守护程序通过重命名日志文件来旋转日志文件。