【问题标题】:Logging to a file from a python worker process in a uWsgi environment在 uWsgi 环境中从 python 工作进程记录到文件
【发布时间】:2020-10-10 02:00:16
【问题描述】:

我有一个使用 Docker compose 部署的 Flask 应用程序,附带一个小型数据库和一个 uWsgi 前端。我想将烧瓶应用程序的某些输出写入特定的日志文件。这个想法是,在午夜,我希望日志文件轮换到第二天,同时保留前 X 天的备份。我在应用首次启动时配置了日志文件,如下所示:

handler = TimedCompressedRotatingFileHandler('/home/root/custom_logs/no_RS_queries_planner_api.log',
                                             when="midnight", encoding='utf8', backupCount=14)

logger = logging.getLogger('query_logger')
logger.addHandler(handler)
handler.suffix = "%Y-%m-%d"

# the all-important app variable:
application = Flask(__name__)

#sample log
logger.warning(value1,value2,value3)

当我在我的机器上本地测试 Flask 应用程序时,这有效,因为运行它只使用一个进程。但是,如果我尝试使用定义了多个工作人员的 uWsgi 来部署它.....:

; app.ini

[uwsgi]
protocol = uwsgi

chdir=/app/app/

; This is the name of our Python file
; minus the file extension
module = main

; This is the name of the variable
; in our script that will be called
callable = application

master = true;

; Set uWSGI to start up x workers
processes = 9

; We use the port 5000 which we will
; then expose on our Dockerfile
socket = 0.0.0.0:5000
vacuum = trued

die-on-term = true

所有工作进程都会在午夜对同一个文件进行翻转。基本上多次覆盖它并导致我丢失日志文件。这似乎仍然是此类部署中的当前问题,并且尝试解决起来非常烦人。有没有什么简单的方法来处理这类事情,而不必大规模地重新构建我的应用程序?

作为参考,TimedCompressedRotatingFileHandler 是从here 中提取的现有日志轮换类的修改。我尝试了一些厚颜无耻的方法,例如尝试获取 uWsgi 工作人员 ID 并将其作为附加后缀附加到日志文件中,但这似乎不起作用,只输出 0。我可以尝试记录到数据库并在午夜按计划输出,但我更愿意先尝试记录方法。

谁能帮我找到解决问题的快速方法?

【问题讨论】:

    标签: python logging concurrency uwsgi


    【解决方案1】:

    正确的解决方案是described in the cookbook,尽管情况略有不同——多个进程使用multiprocessing

    虽然日志记录是线程安全的,并且支持在单个进程中从多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以序列化对单个文件的访问在 Python 中跨多个进程的文件。

    当然,在您的情况下,问题不仅在于从多个进程写入日志文件,还在于从多个进程翻转同一文件。

    您的方案的一个解决方案是:

    1. 所有 uWSGI 工作人员都应该使用不直接使用文件处理程序的日志记录配置,而是使用SocketHandler 通过套接字(TCP/IP 套接字或 Unix 域套接字,如果可用)发送记录的事件。
    2. 您应该有一个单独的进程,它监听这个套接字,并通过将它们记录到文件处理程序来处理从它接收到的日志事件。

    这种方法将写入文件和翻转保持在一个进程中,因此您描述的问题不应该发生。该说明书还包含an example 使用SocketHandler 通过网络发送日志事件。您应该能够轻松地将那里的代码调整为侦听器进程。

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2014-07-21
      相关资源
      最近更新 更多