Django和fcgi -日志问题

qhhrdooz  于 2023-04-07  发布在  Go
关注(0)|答案(3)|浏览(96)

我有一个在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示例都记录到一个文件中,直到它达到大小限制,在这一点上,日志文件将发生轮换。

ukqbszuj

ukqbszuj1#

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

hmae6n7t

hmae6n7t2#

如果是您,我会切换到TimedRotatingFileHandler --我很惊讶基于大小的旋转文件句柄会产生这个问题(因为它应该不受哪些进程正在生成日志条目的影响),但是定时版本(虽然没有控制在你喜欢的参数上)应该可以解决它。或者,写你自己的,更坚实的,旋转文件处理程序(你可以从标准库源代码中获取很多),* 确保 * 变化的进程不会成为问题(因为它们永远不会成为问题)。

efzxgjgh

efzxgjgh3#

由于你使用的是append(“a”)而不是write(“w”)的默认文件打开模式,如果一个进程重新生成,它应该追加到现有的文件中,然后在达到大小限制时翻转。所以我不确定你所看到的是由重新生成CGI进程引起的。(当然,这假设进程重新生成时文件名保持不变)。
虽然日志记录包是线程安全的它不处理多个进程对同一文件的并发访问-因为在stdlib中没有标准的方法来做这件事。我通常的建议是设置一个单独的守护进程,它实现一个套接字服务器,并将通过它接收的事件记录到文件中-其他进程只实现一个SocketHandler来与日志守护进程通信。然后所有的事件将被正确地序列化到磁盘上。Python文档包含了一个可以作为这个需求的基础的工作套接字服务器。

相关问题