我使用gunicorn运行我的烧瓶app的2个过程。 我使用filerotatingfilehandler来旋转日志文件。 问题是当一个进程旋转日志文件,另一个进程不知道,然后它再次旋转文件(现在名为log.txt.1)(到log.txt.2,并可能更改log.txt log.txt.1)。然后,一个进程登录log.txt,而另一个进程登录log.txt.1。 我知道我可以使用watchedfilehandler + logrotate来解决问题。 但我仍然可以使用rotatefilehandler并检测文件名更改吗?
答案 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脚本或文件监视守护程序通过重命名日志文件来旋转日志文件。