Django和fcgi日志问题

2024-10-02 00:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我启动fcgi流程如下:

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

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

^{pr2}$

日志正在工作。然而,当文件的大小不到10Kb,更不用说10Mb了,看起来它们是在旋转。我猜每个fcgi实例只处理10个请求,然后重新生成。每一个fcgi的重生都会创建一个新文件。我确认fcgi经常使用新的进程id启动(很难准确地判断时间,但不到一分钟)。在

有什么办法可以绕过这个问题吗?我希望所有的fcgi实例都记录到一个文件中,直到它达到大小限制,此时将发生日志文件旋转。在


Tags: 文件django实例pyhostmanage网站记录
3条回答

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

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

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

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

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

相关问题 更多 >

    热门问题