Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django和fcgi-日志记录问题_Python_Django_Logging_Fastcgi_Lighttpd - Fatal编程技术网

Python Django和fcgi-日志记录问题

Python Django和fcgi-日志记录问题,python,django,logging,fastcgi,lighttpd,Python,Django,Logging,Fastcgi,Lighttpd,我有一个网站在Django运行。前端是lighttpd,正在使用fcgi托管django 我按如下方式启动fcgi流程: python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encod

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

我按如下方式启动fcgi流程:

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid
file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8')
日志正在工作。但是,当文件的大小甚至不到10Kb时,就好像文件在旋转,更不用说10Mb了。我猜每个fcgi实例只处理10个请求,然后重新生成。fcgi的每个重生都会创建一个新文件。我确认fcgi每隔一段时间都会在新的进程id下启动(很难说确切的时间,但不到一分钟)


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

在您看来,我会切换到一个--我很惊讶基于大小的旋转文件句柄会导致这个问题(因为它应该不受生成日志项的进程的影响),但是定时版本(虽然没有严格控制您喜欢的参数)应该可以解决这个问题。或者,编写您自己的、更可靠的旋转文件处理程序(您可以从标准库源中获取大量信息),以确保不同的进程不会成为问题(因为它们永远不会成为问题)。

因为您似乎正在使用默认的文件打开模式append(“a”)而不是write(“w”),如果进程重新生成,则应将其追加到现有文件中,然后在达到大小限制时滚动。因此,我不确定您看到的是由重新生成CGI进程引起的。(当然,这是假设进程重新生成时文件名保持不变)


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

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

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