【问题标题】:Django and fcgi - logging questionDjango 和 fcgi - 日志记录问题
【发布时间】:2010-11-15 06:57:57
【问题描述】:

我有一个在 Django 中运行的网站。前端是 lighttpd,使用 fcgi 来托管 django。

我按如下方式启动我的 fcgi 进程:

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid

对于日志记录,我有一个 RotatingFileHandler 定义如下:

file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8')

日志记录正在运行。但是,当文件甚至没有达到 10Kb,更不用说 10Mb 时,它们看起来就像在旋转。我的猜测是每个 fcgi 实例只处理 10 个请求,然后重新生成。 fcgi 的每次重生都会创建一个新文件。我确认 fcgi 每隔一段时间就会在新的进程 ID 下启动(很难准确判断时间,但不到一分钟)。

有没有办法解决这个问题?我希望所有 fcgi 实例都记录到一个文件,直到达到大小限制,此时将发生日志文件轮换。

【问题讨论】:

    标签: python django logging fastcgi lighttpd


    【解决方案1】:

    在你的情况下,我会切换到TimedRotatingFileHandler——我很惊讶基于大小的旋转文件句柄会出现这个问题(因为它应该不受生成日志条目的进程的影响),但是定时版本(虽然不能完全控制您喜欢的参数)应该可以解决它。或者,编写自己的、更可靠的旋转文件处理程序(您可以从标准库源代码中获取很多内容),确保不同的进程不会成为问题(因为它们永远不会成为问题)。

    【讨论】:

      【解决方案2】:

      由于您似乎使用附加(“a”)而不是写入(“w”)的默认文件打开模式,如果进程重新生成它应该附加到现有文件,然后在大小限制时翻转到达了。因此,我不确定您所看到的是否是由重新生成 CGI 进程引起的。 (这当然假设在进程重新生成时文件名保持不变)。

      虽然日志包是线程安全的,但它不能处理来自多个进程的对同一个文件的并发访问——因为在 stdlib 中没有标准的方法来做到这一点。我通常的建议是设置一个单独的守护进程,它实现一个套接字服务器并将通过它接收到的事件记录到文件中——然后其他进程只需实现一个 SocketHandler 来与日志记录守护进程通信。然后所有事件将正确序列化到磁盘。 Python 文档包含一个working socket server,可以作为此需求的基础。

      【讨论】:

        【解决方案3】:

        正如 Alex 所说,日志记录是线程安全的,但标准处理程序不能安全地用于将多个进程的日志记录到单个文件中。

        ConcurrentLogHandler 使用文件锁定来允许从多个进程中进行日志记录。

        【讨论】:

          猜你喜欢
          • 2017-12-23
          • 2012-10-02
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多