gpt4 book ai didi

python - 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

转载 作者:太空狗 更新时间:2023-10-30 01:08:58 27 4
gpt4 key购买 nike

给定一个在多个服务器上同时执行的 Django 应用程序,该应用程序如何记录到单个共享日志文件(在网络共享中),而不保持该文件以独占模式永久打开?

当您想要利用日志流时,这种情况适用于 Windows Azure 网站上托管的 Django 应用程序。

关于this sample project ,我尝试使用 ConcurrentLogHandler像这样:

settings.py :

'ConcurrentLogHandler':{
'level': 'DEBUG',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'formatter': 'verbose',
'filename': os.getenv('LOGFILE', 'django.log')
},

views.py :

from time import gmtime, strftime
import logging
from django.http import HttpResponse

logger = logging.getLogger(__name__)

def home(request):
current_time = strftime("%Y-%m-%d %H:%M:%S", gmtime())
logger.info('home ' + current_time)
return HttpResponse("Hello from Django! It is now " + current_time + ".\n")

网站运行时,日志已写入,但文件似乎未刷新。另外,如果我尝试使用 FTP 读取该文件,我会收到以下消息:“550 该进程无法访问该文件,因为该文件正在被另一个进程使用。”

如果我停止应用程序,文件将关闭,我可以读取该文件并查看其中的所有日志。

我假设 ConcurrentLogHandler 将允许对日志文件进行共享访问。这个假设是错误的吗?是否需要一些额外的配置?有替代方案吗?

最佳答案

另一种方法是将所有 Django 日志记录发送到队列(例如 Redis 队列,使用类似 thismultiprocessing.Queue),然后单个进程读取队列并将记录写入文件。有更多的移动部件,因此这可能适合也可能不适合您的需求,但它会消除文件争用。请参阅this post使用来自多个进程的日志记录时的更多选项。

您当然也可以设置套接字服务器并使用 SocketHandler 将所有 Django 进程的日志记录事件发送到服务器,然后服务器写入文件。 Python 文档包含 working example这样的服务器。

关于python - 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com