我有一个在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实例都记录到一个文件中,直到它达到大小限制,此时将发生日志文件轮换。
发布于 2010-01-28 04:12:11
正如Alex所说,日志记录是线程安全的,但标准处理程序不能安全地用于将多个进程记录到单个文件中。
ConcurrentLogHandler使用文件锁定来允许从多个进程中进行日志记录。
发布于 2009-07-30 02:25:32
在您的情况下,我会切换到TimedRotatingFileHandler --我很惊讶基于大小的旋转文件句柄会带来这个问题(因为它应该不受产生日志条目的进程的影响),但是timed版本(尽管不是完全控制在您喜欢的参数上)应该可以解决这个问题。或者,编写您自己的、更可靠的旋转文件处理程序(您可以从标准库源代码中获取很多),以确保不同的进程不会成为问题(因为它们永远不会成为问题)。
发布于 2009-07-30 11:40:40
由于您似乎正在使用默认的文件打开模式append ("a")而不是write ("w"),如果进程重新生成,则应将其附加到现有文件,然后在达到大小限制时进行翻转。所以我不确定你看到的是不是由重新生成的CGI进程引起的。(当然,这假设当进程重新派生时,文件名保持不变)。
尽管日志记录包是线程安全的,但它不能处理来自多个进程的对同一文件的并发访问-因为在stdlib中没有标准的访问方法。我通常的建议是设置一个单独的守护进程,它实现一个套接字服务器,并将通过它接收的事件记录到文件中-然后其他进程只实现一个SocketHandler来与日志守护进程通信。然后,所有事件都将被正确地序列化到磁盘。Python文档包含一个working socket server,它可以作为此需求的基础。
https://stackoverflow.com/questions/1203896
复制相似问题