代码之家  ›  专栏  ›  技术社区  ›  Krystian Cybulski

Django和FCGi-记录问题

  •  5
  • Krystian Cybulski  · 技术社区  · 17 年前

    我在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')
    

    日志记录正在工作。但是,当文件甚至达不到10 KB时,就好像文件在旋转,更不用说10 MB了。我猜每个fcgi实例只处理10个请求,然后重新生成。每个重新绘制的fcgi都会创建一个新文件。我确认fcgi每隔一段时间就在新的进程ID下启动一次(很难准确地知道时间,但不到一分钟)。

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

    3 回复  |  直到 15 年前
        1
  •  6
  •   gabor    16 年前

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

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

        2
  •  2
  •   David    15 年前

    在你的鞋子里,我会换成 TimedRotatingFileHandler --令人惊讶的是,基于大小的旋转文件句柄产生了这个问题(因为它不受生成日志条目的进程的影响),但是定时版本(尽管不完全控制您喜欢的参数)应该能够解决这个问题。或者,编写自己的、更可靠的、旋转的文件处理程序(您可以从标准库源中获取很多信息),以便 确保 不同的过程不是问题(因为它们不应该是)。

        3
  •  0
  •   Vinay Sajip    17 年前

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

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